Java 当序列化对象中未存储serialVersionId时,反序列化进程如何知道序列化对象的serialVersionId?
当serialVersionId未存储在序列化对象中时,反序列化进程如何识别序列化对象的serialVersionId,序列化对象需要与将转换为的类的串行版本id进行比较,要检查它是否兼容?serialVersionUID是一个与其类一起序列化的Java 当序列化对象中未存储serialVersionId时,反序列化进程如何知道序列化对象的serialVersionId?,java,serialization,deserialization,Java,Serialization,Deserialization,当serialVersionId未存储在序列化对象中时,反序列化进程如何识别序列化对象的serialVersionId,序列化对象需要与将转换为的类的串行版本id进行比较,要检查它是否兼容?serialVersionUID是一个与其类一起序列化的静态最终long 如果不手动为类提供一个,则序列化运行时将计算默认的serialVersionUID值 您可以找到以下方面的更多详细信息: 如果可序列化类未显式声明 serialVersionUID,则序列化运行时将计算 基于各个方面的该类的默认Seri
静态最终long
如果不手动为类提供一个,则序列化运行时将计算默认的serialVersionUID值
您可以找到以下方面的更多详细信息:
如果可序列化类未显式声明
serialVersionUID,则序列化运行时将计算
基于各个方面的该类的默认SerialVersionId值
类的,如Java(TM)对象序列化中所述
规范。但是,强烈建议:
可序列化类显式声明serialVersionUID值,因为
默认的serialVersionUID计算对类高度敏感
详细信息可能因编译器实现而异,可以
因此,在运行期间会导致意外的InvalidClassException
反序列化。因此,要保证一致的serialVersionUID
跨不同java编译器实现的值,可序列化
类必须声明显式的SerialVersionId值。也是
强烈建议显式serialVersionUID声明使用
私有修饰符,因为此类声明仅适用于
立即声明的类--SerialVersionId字段不可用
作为继承成员使用。数组类不能声明显式
serialVersionUID,因此它们始终具有默认的计算值,但
对于以下情况,不需要匹配serialVersionUID值
数组类
描述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)
序列化对象时,首先序列化其类的描述符(仅一次),该描述符包含
serialVersionUID
。它不会作为对象静态的一部分进行传输
请参阅。谁说序列化对象不包括
serialVersionId
?我认为序列化过程不存储类的静态成员通常是这样的,但是serialVersionId
是特殊的。@KevinKrumwiede它并不特殊,因为序列化对象神奇地包含了serialVersionId
。事实并非如此。机制是完全不同的。这就是为什么在反序列化对象之前检测到serialVersionUID
不一致。@EJP如果不是作为对象结构的一部分,则该版本将与对象一起序列化,对吗?它将成为对象的序列化表示的一部分。但是,静态变量不会通过序列化进行序列化?这是正确的。。。除了serialVersionUID!它是一个“特殊”变量,由序列化过程以不同方式处理。它不是“用它的类序列化”,因为它的类不是序列化的。