当serialVersionId没有存储在序列化对象中时,反序列化过程如何知道序列化对象的serialVersionId?

时间:2015-10-23 18:57:22

标签: java serialization deserialization

当serialVersionId没有存储在序列化对象中时,反序列化过程如何知道序列化对象的serialVersionId,该序列化对象需要与要转换为的类的串行版本ID进行比较,以检查它是否兼容?

3 个答案:

答案 0 :(得分:2)

This article描述了Java对象的序列化形式:

AC ED: STREAM_MAGIC. Specifies that this is a serialization protocol.
00 05: STREAM_VERSION. The serialization version.
0x73: TC_OBJECT. Specifies that this is a new Object.
0x72: TC_CLASSDESC. Specifies that this is a new class.
00 0A: Length of the class name.
53 65 72 69 61 6c 54 65 73 74: SerialTest, the name of the class.
05 52 81 5A AC 66 02 F6: SerialVersionUID, the serial version identifier of this class.
(fields omitted)

答案 1 :(得分:1)

serialVersionUID 是使用其类序列化的static final long

如果您没有为您的类手动提供一个,则序列化运行时将计算默认的serialVersionUID值。

您可以在http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

找到更多详细信息
  

如果可序列化类没有显式声明a   serialVersionUID,然后序列化运行时将计算一个   基于各个方面的该类的默认serialVersionUID值   该类的类,如Java(TM)对象序列化中所述   规格。但是,强烈建议所有人   可序列化类显式声明serialVersionUID值,因为   默认的serialVersionUID计算对类非常敏感   细节可能因编译器实现而异,并且可以   因此导致意外的InvalidClassExceptions期间   反序列化。因此,要保证一致的serialVersionUID   不同java编译器实现的值,可序列化   class必须声明一个显式的serialVersionUID值。也是   强烈建议显式serialVersionUID声明使用   尽可能使用私有修饰符,因为此类声明仅适用于   立即声明的类 - serialVersionUID字段不是   作为继承成员有用。数组类不能声明显式   serialVersionUID,所以它们总是有默认的计算值,但是   免除匹配serialVersionUID值的要求   数组类。

答案 2 :(得分:0)

当对象被序列化时,首先将其的描述符序列化(仅一次),并且该描述符包含serialVersionUID。它不会作为对象静态的一部分传输。

请参阅newClassDesc in the Object Serialization Specification, Object Serialization Stream Protocol chapter