一尘不染

什么是 serialVersionUID,我为什么要使用它?

javascript

serialVersionUID缺少 a 时 Eclipse 会发出警告。

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

什么是serialVersionUID它以及为什么它很重要?请展示一个缺少serialVersionUID会导致问题的示例。


阅读 265

收藏
2022-01-18

共1个答案

一尘不染

文档java.io.Serializable可能与您得到的解释一样好:

序列化运行时与每个可序列化类关联一个版本号,称为 a serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已为该对象加载了与序列化兼容的类。如果接收者为对象加载了一个serialVersionUID与相应发送者的类不同的类,那么反序列化将产生一个 InvalidClassException. 可序列化的类可以通过声明一个必须是 static、final 和 typeserialVersionUID的字段来显式声明自己的:serialVersionUID``long

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

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

2022-01-18