我正在阅读java中的序列化。Java说静态变量不与对象序列化。serialVersionUID是序列化过程中必须的。当对象被序列化时,serialVersionUID与其他内容一起序列化。这是一般序列化规则的一个例外,即“静态字段未序列化”</p>
谁能告诉我为什么它是静态的。它可以是非静态的吗?
我正在阅读java中的序列化。Java说静态变量不与对象序列化。serialVersionUID是序列化过程中必须的。当对象被序列化时,serialVersionUID与其他内容一起序列化。这是一般序列化规则的一个例外,即“静态字段未序列化”</p>
谁能告诉我为什么它是静态的。它可以是非静态的吗?
因为一旦 Object 成功创建,就可以访问任何对象变量/成员。不创建对象变量就不能访问它。现在回到问题,在反序列化期间,需要从数据中创建对象。如果无法检查 object 是否可反序列化,则无法获取 Object 成员。
出于同样的原因,UID 是静态的。
首先,您应该了解 a 的serialVersionUID
作用。
序列化运行时与每个可序列化类关联一个版本号,称为 serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已加载与序列化兼容的该对象的类。如果接收者为对象加载了一个类,该对象的 serialVersionUID 与相应发送者的类不同,则反序列化将导致 InvalidClassException。
决定了一个类serialVersionUID
的不同版本之间的兼容性。由于该属性绑定到该类,因此必须将其设为。static
serialVersionUID 是静态的,因为它不适用于类实例,而是类本身。它保存在 ObjectOutputStream 类描述符中。
该 serialVersionUID 是一种约定,用于验证您在序列化器和反序列化器中是否具有相同的二进制版本,并且过时的版本不会出错。此外,您可能在反序列化器中对不同类型的类具有相同的名称,因此 serialVersionUID 就像一个排序或唯一标识符。
这就是为什么它必须是静态的(因此它“绑定到类,而不是每个实例)并与序列化数据一起“发送”。
它必须是静态的,因为 JRE 要求它保持静态。推理可能很简单,可以通过静态方式访问它,而无需实际创建类的对象。
从javadocs:
序列化运行时将版本号与每个可序列化类相关联,称为 serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已为该对象加载了与序列化兼容的类。如果接收者为对象加载了一个类,该对象的 serialVersionUID 与相应发送者的类不同,则反序列化将导致 InvalidClassException。可序列化的类可以通过声明一个名为“serialVersionUID”的字段来显式声明自己的serialVersionUID,该字段必须是静态的、最终的和long类型:
它被序列化是一个例外。我相信这是static
因为它绑定到类,而不是类的任何实例。类的所有实例都应遵守相同的serialVersionUID
. 再次将其设为静态意味着运行时实际上可以在不创建任何对象的情况下获取该 ID,而反序列化对象的先决条件是确定 ID。当一个对象被序列化时,类名、对象的状态(非静态成员变量)和它们都会serialVersionUID
被持久化。