为什么 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/