java - 为什么不自动生成 serialVersionUID?

标签 java serialization serialversionuid

为什么 serialVersionUID 没有自动生成?我在应用程序服务器上遇到了一个问题,显然缓存了一个旧类。

最佳答案

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

假设您有一个名为 Foo 的类,并且它没有 serialversionuid(默认值),并且您将 Foo 的一个实例序列化到一个文件中。稍后,您向 Foo 类添加了一些新成员。如果您尝试从文件中反序列化 Foo 对象,您将收到一个序列化失败消息,指出这些对象不兼容。它们不兼容的,这是您想要的并且是默认设置。它们不兼容,因为 Foo 类中的新成员无法从 Foo 的旧序列化实例初始化。

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

如果您是第一次创建新类,并且设置了 serialversionuid,您正在签订契约(Contract)。该契约是,“对于具有相同 serialversionuid 的此类的所有 future 版本,我将保证它们在状态和序列化方面兼容”

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

关于java - 为什么不自动生成 serialVersionUID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3569628/

相关文章:

java - 我的 hibernate 请求出错

c++ - 用于枚举序列化的函数模板

java - 添加一个方法会改变我的类上 java 计算的 serialVersionUid 吗?

java - eclipse 中的 serialVersionUID 字段警告

java - 谁能告诉我这里的试卷要求什么?

java - Libgdx SpriteBatch 是否绘制到 StencilBuffer?

Java 未经检查或不安全操作消息

java - Spring 启动2.2.2 : Jackson serializer for custom pagination doesn't work

java - 从 Java 5 开始不再需要 serialVersionUID?

java - RestEasy代理框架文件上传