当我使用ObjectInputStream读取与程序中当前定义的序列对象不兼容的序列化对象时会发生什么? 我是否会获得异常或仅仅是完全错误的数据?
如果我在编译新版本时更新了serialVersionUID(根据需要)会有什么不同吗?
我环顾四周,似乎无法找到会发生什么 - 只是你必须更新serialVersionUID。
答案 0 :(得分:1)
This answer总结一下:
想象一下,你有一个名为Foo的类,它没有serialversionuid(默认值),你将一个Foo实例序列化为一个文件。稍后,您将向Foo类添加一些新成员。如果您尝试从文件反序列化Foo对象,您将收到序列化失败,指出对象不兼容。它们是不兼容的,这是你想要的并且是默认的。它们是不兼容的,因为无法从旧的Foo序列化实例初始化Foo类中的新成员。
现在,您可能会说,“我不在乎,在我的应用程序中,这些字段未被初始化是可以接受的”。如果确实如此,您可以将NEW Foo类的serialversionuid设置为与OLD Foo类相同。这将告诉Java这些对象与serializablity相关,并且当你将旧的Foo实例反序列化为新的Foo类时,Java不会抱怨(但是新的字段仍然是未初始化的。)
如果您是第一次创建新课程,并且设置了serialversionuid,那么您正在签订合同。您说,“对于具有相同serialversionuid的此类的所有未来版本,我将保证它们在状态和序列化方面兼容”。
如果更改了某个类,并且显然想要禁用旧版本的反序列化,则可以将serialversionuid更改为新值。如果尝试将旧对象反序列化为新的类实例,这将导致抛出异常。
答案 1 :(得分:0)
如果隐式或显式serialVersionUID不匹配,则会出现如下异常:
java.io.InvalidClassException: SerialVersionUID; local class incompatible: stream classdesc serialVersionUID = 2, local class serialVersionUID = 3