当出现以下情况时 Eclipse 会发出警告serialVersionUID
不见了。
可序列化类 Foo 未声明静态final
long 类型的serialVersionUID 字段
What is serialVersionUID
为什么它很重要?请举例说明缺少的地方serialVersionUID
会引起问题。
的文档java.io.Serializable https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/Serializable.html可能是您能得到的最好的解释:
序列化运行时将每个可序列化类与一个版本号关联起来,称为serialVersionUID
,在反序列化过程中使用它来验证序列化对象的发送者和接收者是否已为该对象加载了与序列化兼容的类。如果接收者已经为具有不同类型的对象加载了一个类serialVersionUID
比相应的发送者类的值要大,那么反序列化将导致InvalidClassException https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/InvalidClassException.html。可序列化的类可以声明自己的serialVersionUID
通过声明一个名为的字段来显式地serialVersionUID
必须是静态的、最终的并且是类型的long
:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
如果可序列化类没有显式声明serialVersionUID
,那么序列化运行时将计算一个默认值serialVersionUID
该类的值基于该类的各个方面,如 Java(TM) 对象序列化规范中所述。然而,它是强力推荐所有可序列化的类都显式声明serialVersionUID
值,因为默认值serialVersionUID
计算对类细节高度敏感,这些细节可能因编译器实现而异,因此可能会导致意外的结果InvalidClassExceptions
反序列化期间。因此,为保证一致serialVersionUID
跨不同 java 编译器实现的值,可序列化类必须声明显式serialVersionUID
价值。还强烈建议明确serialVersionUID
声明尽可能使用 private 修饰符,因为此类声明仅适用于立即声明的类 -serialVersionUID
字段作为继承成员没有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)