从Java 5开始不再需要serialVersionUID?

时间:2011-09-12 08:19:48

标签: java serialization serialversionuid

我最近阅读了一条评论说,从Java 5开始,不再需要使用serialVersionUID来使同一类的不同版本兼容序列化/反序列化。它是否正确?也许它与协变返回类型混淆了。所以想和大家一起检查一下。

2 个答案:

答案 0 :(得分:5)

JavaDocs for Java 5仍然表明需要它:

  

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

答案 1 :(得分:3)

从Java 1.4开始,您已经能够使用XMLEncoder进行序列化,这会忽略任何serialVersionUID,就像大多数其他序列化库一样。

但是,如果使用ObjectOutputStream,则其serialVersionUID的使用情况未发生变化。