Java 为什么SerialVersionUID是静态的

Java 为什么SerialVersionUID是静态的,java,serialization,Java,Serialization,我正在读java中的序列化。java说静态变量不是用对象序列化的。SerialVersionId是序列化过程中必须的。序列化对象时,SerialVersionId会与其他内容一起序列化。这是一般序列化规则的一个例外,“静态字段不序列化” 有人能告诉我为什么它是静态的吗?它可以是非静态的吗?SerialVersionId是一种惯例,用于验证序列化程序和反序列化程序中的二进制版本是否相同,并且过时的版本不会出问题。此外,在反序列化程序中,不同类型的类可能有相同的名称,因此serialVersionU

我正在读java中的序列化。java说静态变量不是用对象序列化的。SerialVersionId是序列化过程中必须的。序列化对象时,SerialVersionId会与其他内容一起序列化。这是一般序列化规则的一个例外,“静态字段不序列化”


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

SerialVersionId是一种惯例,用于验证序列化程序和反序列化程序中的二进制版本是否相同,并且过时的版本不会出问题。此外,在反序列化程序中,不同类型的类可能有相同的名称,因此serialVersionUID就像一个sort od唯一标识符


这就是为什么它必须是静态的(因此它“绑定到类,而不是每个实例”)并且与序列化数据一起“发送”。

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

从:

序列化运行时与每个可序列化类关联 版本号,称为serialVersionUID,在 反序列化以验证序列化的发送方和接收方 对象已为该对象加载与兼容的类 关于序列化。如果接收器已为 对象的SerialVersionId与的SerialVersionId不同 对应发件人的类,则反序列化将导致 InvalidClassException。可序列化类可以声明自己的类 通过声明名为 “serialVersionUID”必须是静态的,final,且类型为long:


因为一旦成功创建对象,就可以访问任何对象变量/成员。不创建对象变量,就无法访问对象变量。现在回到问题,在反序列化过程中,需要从数据创建对象。如果无法检查对象是否可反序列化,则无法获取对象成员


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

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

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

发件人:

序列化运行时与每个可序列化类关联 版本号,称为serialVersionUID,在 反序列化以验证序列化的发送方和接收方 对象已为该对象加载与兼容的类 关于序列化。如果接收器已为 对象的SerialVersionId与的SerialVersionId不同 对应发件人的类,则反序列化将导致 InvalidClassException


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

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

没有说明原因?我认为OP很想知道为什么JRE要求它是静态的