Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当序列化对象中未存储serialVersionId时,反序列化进程如何知道序列化对象的serialVersionId?_Java_Serialization_Deserialization - Fatal编程技术网

Java 当序列化对象中未存储serialVersionId时,反序列化进程如何知道序列化对象的serialVersionId?

Java 当序列化对象中未存储serialVersionId时,反序列化进程如何知道序列化对象的serialVersionId?,java,serialization,deserialization,Java,Serialization,Deserialization,当serialVersionId未存储在序列化对象中时,反序列化进程如何识别序列化对象的serialVersionId,序列化对象需要与将转换为的类的串行版本id进行比较,要检查它是否兼容?serialVersionUID是一个与其类一起序列化的静态最终long 如果不手动为类提供一个,则序列化运行时将计算默认的serialVersionUID值 您可以找到以下方面的更多详细信息: 如果可序列化类未显式声明 serialVersionUID,则序列化运行时将计算 基于各个方面的该类的默认Seri

当serialVersionId未存储在序列化对象中时,反序列化进程如何识别序列化对象的serialVersionId,序列化对象需要与将转换为的类的串行版本id进行比较,要检查它是否兼容?

serialVersionUID是一个与其类一起序列化的
静态最终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!它是一个“特殊”变量,由序列化过程以不同方式处理。它不是“用它的类序列化”,因为它的类不是序列化的。