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