首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不自动生成serialVersionUID?

为什么不自动生成serialVersionUID?
EN

Stack Overflow用户
提问于 2010-08-26 03:44:46
回答 3查看 3.2K关注 0票数 10

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-26 09:26:11

serialversionuid不会自动生成,因为它很危险。当设置了serialversionuid时,这意味着一个类的两个版本在序列化方面是兼容的。

假设您有一个名为Foo的类,并且它没有序列版本and (缺省值),并且您将Foo的一个实例序列化为一个文件。稍后,将一些新成员添加到Foo类中。如果您试图反序列化文件中的Foo对象,您将得到一个序列化失败,指出这些对象不兼容。它们是不兼容的,这是你想要的,也是默认的。它们是不兼容的,因为Foo类中的新成员不能从Foo的旧序列化实例初始化。

现在,您可能会说,“我不在乎,在我的应用程序中,这些字段未初始化是可以接受的”。如果确实如此,您可以将新的Foo类的serialversionuid设置为与旧的Foo类相同。这将告诉Java对象在可序列化方面是兼容的,并且当您将旧的Foo实例反序列化为新的Foo类时,Java不会报错(但新字段仍未初始化)。

如果您是第一次创建新类,并且设置了序列版本and,则输入的是合同。该约定是,“对于这个类的所有未来版本,我将保证它们在状态和序列化方面是兼容的”。

如果您更改了一个类,并且明确希望禁止对旧版本进行反序列化,则可以将serialversionuid更改为新值。如果试图将旧对象反序列化为新的类实例,这将导致抛出异常。

票数 22
EN

Stack Overflow用户

发布于 2010-08-26 03:49:53

它会根据类的结构自动生成。如果结构改变,则重新生成id (根据serialization specification,它是类的散列)。

所以你最好定义一个显式的serialVersionUID

票数 9
EN

Stack Overflow用户

发布于 2010-08-26 04:17:31

如果您使用Eclipse作为您的集成开发环境,您可以右键单击有关缺少serialVersionUID的警告,您将看到两个选项:

1)定义Eclipse默认值,其值为1L;或者

2)定义一个随机生成的长值

如果您关心序列化对象的版本控制,则需要在每次修改类时手动重新生成一个新值。Serializable接口的Javadoc告诉我们如果根本不声明serialVersionUID会发生什么:

如果可序列化类没有显式声明serialVersionUID,则序列化运行时将根据该类的各个方面计算该类的默认serialVersionUID值,如Java对象序列化规范中所述。但是,强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类细节高度敏感,这些细节可能因编译器实现而异,因此在反序列化过程中可能会导致意外的InvalidClassExceptions。因此,为了在不同的java编译器实现中保证一致的serialVersionUID值,可序列化的类必须声明显式的serialVersionUID值。

在实践中,我发现即使在两台或更多的机器上(例如,从Subversion中检出)开始使用相同的源代码,并且类中的serialVersionUID未在类中定义,编译代码时,类中编译器生成的值在每台机器上也是不同的。这可能会在开发过程中导致令人困惑的错误。

如果您确信不会出现与新版本的类不同步的陈旧序列化对象的情况(或者两个JVM互相发送不同步的序列化对象,可能是通过网络或套接字连接),那么只需将serialVersionUID的值设置为1L,并永远保持该值不变。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3569628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档