什么是串行版本UID,我为什么要使用它?

2022-08-31 01:24:03

Eclipse 在 缺少 时发出警告。serialVersionUID

可序列化类 Foo 不声明 long 类型的静态最终 serialVersionUID 字段

什么是重要的,为什么是重要的?请举一个示例,其中缺少会导致问题。serialVersionUIDserialVersionUID


答案 1

java.io.Serializable的文档可能是你得到的一个很好的解释:

序列化运行时与每个可序列化类关联一个版本号,称为 a,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否为该对象加载了与序列化兼容的类。如果接收方为对象加载的类与相应发送方类的类不同,则反序列化将导致 InvalidClassException。可序列化的类可以通过声明一个名为的字段来显式声明自己的字段,该字段必须是静态的、final 的,并且类型为:serialVersionUIDserialVersionUIDserialVersionUIDserialVersionUIDlong

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

如果可序列化类未显式声明 ,则序列化运行时将根据类的各个方面计算该类的默认值,如 Java(TM) 对象序列化规范中所述。但是,强烈建议所有可序列化的类显式声明值,因为默认计算对类详细信息高度敏感,这些类详细信息可能因编译器实现而异,因此可能导致在反序列化期间出现意外情况。因此,为了保证不同 Java 编译器实现之间的值一致,可序列化类必须声明显式值。还强烈建议显式声明在可能的情况下使用私有修饰符,因为此类声明仅适用于立即声明的类 - 字段作为继承成员没有用处。serialVersionUIDserialVersionUIDserialVersionUIDserialVersionUIDInvalidClassExceptionsserialVersionUIDserialVersionUIDserialVersionUIDserialVersionUID


答案 2

如果你只是因为为了实现而必须序列化而序列化(谁在乎你是否序列化为 ,例如...如果它被存储或未存储,您可能不关心表单对象),那么您可以忽略这一点。HTTPSessionde-serializing

如果您实际使用的是序列化,则只有在计划直接使用序列化来存储和检索对象时才重要。表示类版本,如果类的当前版本与其以前的版本不向后兼容,则应递增它。serialVersionUID

大多数情况下,您可能不会直接使用序列化。如果是这种情况,请单击快速修复选项生成默认值,无需担心。SerialVersionUID