10 java serialization serialversionuid
为什么不serialVersionUID自动生成?我在应用程序服务器上遇到了一个问题,显然是在缓存旧类.
bre*_*ttw 22
serialversionuid不会自动生成,因为它很危险.设置serialversionuid时,意味着类的两个版本在序列化方面是兼容的.
想象一下,你有一个名为Foo的类,它没有serialversionuid(默认值),你将一个Foo实例序列化为一个文件.稍后,您将向Foo类添加一些新成员.如果您尝试从文件反序列化Foo对象,您将收到序列化失败,指出对象不兼容.它们是不兼容的,这是你想要的,是默认的.它们是不兼容的,因为Foo类中的新成员无法从旧的Foo序列化实例初始化.
现在,您可能会说,"我不在乎,在我的应用程序中,这些字段未被初始化是可以接受的".如果确实如此,您可以将新 Foo类的serialversionuid设置为与旧 Foo类相同.这将告诉Java这些对象与serializablity兼容,当你将旧的Foo实例反序列化为新的Foo类时,Java不会抱怨(但是新的字段仍然是未初始化的).
如果您是第一次创建新类,并且设置了serialversionuid,则表示您正在输入合同.该合同是"对于具有相同serialversionuid的此类的所有未来版本,我将保证它们在状态和序列化方面兼容".
如果更改了类,并且明确要禁止对旧版本进行反序列化,则可以将serialversionuid更改为新值.如果尝试将旧对象反序列化为新的类实例,则会导致抛出异常.