为什么不是 serialVersionUID 自动生成?我在一个旧类被缓存的应用程序服务器上遇到了一个问题。

有帮助吗?

解决方案

串行versionuID不会自动生成,因为它很危险。当设置serialversionuid时,这意味着两个类别的两个版本相对于序列化是兼容的。

想象您有一个名为Foo的课程,它有 没有序列化 (默认值),然后您将foo的实例序列化为文件。后来,您将一些新成员添加到FOO课程中。如果您尝试从文件中对foo对象进行估算,则将获得序列化故障,说明对象不兼容。他们 不兼容,这是 你想要什么 并且是默认值。它们是不兼容的,因为Foo类中的新成员无法从Foo的旧序列化实例中初始化。

现在,您可能会说:“我不在乎,在我的应用程序中,这些领域是可以接受的。”如果说 真的 是这样,您可以设置 新的 foo类与 老的 Foo类。这将告诉Java,这些对象相对于序列化是兼容的,当您将旧的foo实例化为新的Foo类中时,Java不会抱怨(但是新字段仍然是不可初学的)。

如果您是第一次创建新类,并且设置serialversionuid, 您正在签订合同. 。该合同是 “对于以相同的serialversionuid为单位的所有未来版本,我将保证它们在状态和序列化方面是兼容的”.

如果您更改课,您 明确 想要 不允许 旧版本的挑选化,您可以将serialversionuid更改为新值。如果试图将旧对象估算为新的类实例,这将导致异常。

其他提示

它是根据类的结构自动生成的。如果结构发生变化,则ID将被再生(根据 序列化规范 这是班级的主题)。

因此,您最好定义一个明确的 serialVersionUID.

如果您将Eclipse用作IDE,则可以右键单击有关丢失的串行verionuid的警告,您将获得两个选择:

1)定义具有值1L的Eclipse默认值;或者
2)定义一个随机生成的长值

如果您关心序列化对象的版本控制,则每次修改类时,都需要手动重新生成新值。可序列化界面的Javadoc可以说如果您完全不声明serialversionuid会发生什么:

如果可序列化类未明确声明serialversionuid,则序列化运行时将根据类的各个方面计算该类的默认序列化值,如JAVA(TM)对象序列化规范中所述。但是,强烈建议所有可序列化类明确声明串行versionuID值,因为默认序列化计算对可能因编译器的实现而变化的类细节非常敏感,因此可能导致意外的无效classexceptions在求职过程中。因此,为了确保不同Java编译器实现的一致序列化值,可序列化类必须声明明确的serialversionuid值。

实际上,我发现,即使您从两台或多个机器上使用相同的源代码开始(例如,在颠覆下检查),其中serialversionuid在类中不确定,同类中的编译器生成的值也不同计算代码时的机器。这可能会在开发过程中引起令人困惑的错误。

如果您确定您永远不会有一个陈旧的序列化对象,这些对象与较新版本的类别(或两个jvms彼此之间发送离同步序列化对象,也许是跨越同步的对象,也许是跨越网络或套接字连接)然后只为serialversionuid设置1升值,然后将其永久保留。

http://download-llnw.oracle.com/javase/6/docs/api/java/io/serializable.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top