为什么不自动生成serialVersionUID?我在应用服务器上遇到了一个问题,很明显,缓存的是一个旧的类。
发布于 2010-08-26 09:26:11
serialversionuid不会自动生成,因为它很危险。当设置了serialversionuid时,这意味着一个类的两个版本在序列化方面是兼容的。
假设您有一个名为Foo的类,并且它没有序列版本and (缺省值),并且您将Foo的一个实例序列化为一个文件。稍后,将一些新成员添加到Foo类中。如果您试图反序列化文件中的Foo对象,您将得到一个序列化失败,指出这些对象不兼容。它们是不兼容的,这是你想要的,也是默认的。它们是不兼容的,因为Foo类中的新成员不能从Foo的旧序列化实例初始化。
现在,您可能会说,“我不在乎,在我的应用程序中,这些字段未初始化是可以接受的”。如果确实如此,您可以将新的Foo类的serialversionuid设置为与旧的Foo类相同。这将告诉Java对象在可序列化方面是兼容的,并且当您将旧的Foo实例反序列化为新的Foo类时,Java不会报错(但新字段仍未初始化)。
如果您是第一次创建新类,并且设置了序列版本and,则输入的是合同。该约定是,“对于这个类的所有未来版本,我将保证它们在状态和序列化方面是兼容的”。
如果您更改了一个类,并且明确希望禁止对旧版本进行反序列化,则可以将serialversionuid更改为新值。如果试图将旧对象反序列化为新的类实例,这将导致抛出异常。
https://stackoverflow.com/questions/3569628
复制相似问题