【问题标题】:serialVersionUID no longer required from Java 5 onwards?从 Java 5 开始不再需要 serialVersionUID?
【发布时间】:2011-11-15 03:35:58
【问题描述】:
我最近读到一条评论说,从 Java 5 开始,不再需要使用 serialVersionUID 来使同一类的不同版本兼容序列化/反序列化。它是否正确?也许它与协变返回类型混淆了。所以想和大家一起看看。
【问题讨论】:
标签:
java
serialization
serialversionuid
【解决方案1】:
JavaDocs for Java 5 仍然声明需要它:
如果可序列化类没有显式声明 serialVersionUID,则序列化运行时将根据类的各个方面为该类计算默认的 serialVersionUID 值,如 Java(TM) 对象序列化规范中所述。但是,强烈建议所有可序列化的类都显式声明 serialVersionUID 值,因为默认的 serialVersionUID 计算对类细节高度敏感,这些细节可能因编译器实现而异,因此可能在反序列化期间导致意外的 InvalidClassExceptions。因此,为了保证在不同的 java 编译器实现之间具有一致的 serialVersionUID 值,可序列化的类必须声明一个显式的 serialVersionUID 值。还强烈建议显式的 serialVersionUID 声明尽可能使用 private 修饰符,因为此类声明仅适用于立即声明的类——serialVersionUID 字段不能用作继承的成员。
【解决方案2】:
从 Java 1.4 开始,您可以使用 XMLEncoder 进行序列化,这会忽略任何 serialVersionUID,就像大多数其他序列化库一样。
但是如果你使用 ObjectOutputStream,它对 serialVersionUID 的使用并没有改变。