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