为什么SerialVersionUID是静态的

时间:2013-07-25 05:24:26

标签: java serialization

我在阅读java.Java中的序列化时说静态变量没有用object.serialVersionUID序列化是序列化过程中必须的。当一个对象被序列化时,serialVersionUID会与其他内容一起序列化。这是一般序列化规则的一个例外,即“静态字段未序列化”

有人可以告诉我为什么它是静态的。它可以是非静态的吗?

6 个答案:

答案 0 :(得分:6)

因为一旦成功创建了Object,就可以访问任何对象变量/成员。您无法在不创建对象变量的情况下访问它现在回过头来看,在反序列化期间,需要从数据中创建Object。如果无法检查对象是否可反序列化,则无法获取Object成员。

出于同样的原因,UID被设为静态。

答案 1 :(得分:1)

首先,您应该了解serialVersionUID的作用。

来自java.io.Serializable

  

序列化运行时与每个可序列化的类a关联   版本号,称为serialVersionUID,在此期间使用   反序列化以验证序列化的发送方和接收方   object已加载与该对象兼容的类   尊重序列化。如果接收器已加载了一个类   具有与其不同的serialVersionUID的对象   相应的发件人类,然后反序列化将导致   InvalidClassException。

serialVersionUID确定的不同版本之间的兼容性。由于属性绑定到类,因此必须将其设为static

答案 2 :(得分:0)

serialVersionUID是一个约定,用于验证序列化器和反序列化器中的二进制版本是否相同,过时的版本不会出错。此外,可能是您在反序列化程序中为不同类别的类具有相同名称的情况,因此serialVersionUID类似于排序od唯一标识符。

这就是为什么它必须是静态的(所以它是“限制在类中,而不是每个实例”)和“发送”以及序列化数据。

答案 3 :(得分:0)

它必须是静态的,因为JRE强制要求它。推理可能很简单,可以以静态方式访问,而无需实际创建类的对象。

来自javadocs

  

序列化运行时与每个可序列化的类a关联   版本号,称为serialVersionUID,在此期间使用   反序列化以验证序列化的发送方和接收方   object已加载与该对象兼容的类   尊重序列化。如果接收器已加载了一个类   具有与其不同的serialVersionUID的对象   相应的发件人类,然后反序列化将导致   InvalidClassException。可序列化的类可以声明它自己的类   serialVersionUID通过声明一个名为的字段显式地显示   “ serialVersionUID”必须是静态的, final,类型为long:

答案 4 :(得分:0)

它被序列化是一个例外。我相信它是static因为它绑定到类,而不是类的任何实例。该类的所有实例都应遵循相同的serialVersionUID。再次使其静态意味着运行时实际上可以在不创建任何对象的情况下获取该ID,而反序列化对象的先决条件将是确定ID。对象序列化时,类名,对象状态(非静态成员变量)和serialVersionUID将保持不变。

答案 5 :(得分:0)

serialVersionUID是静态的,因为它不适用于类实例而是类本身。它保存在ObjectOutputStream类描述符中。