2011-08-02 21 views
3

从2004年开始,我已经有了一个Serializable类,该类已在生产中使用。但是,编写它的人忘记了生成serialVersionUID将SerialVersionUID添加到已被使用的可序列化类中

事情排序作品(有一个很大的评论警告,在班上不碰任何东西),但在不同的相关工作类,而我有一个InvalidCastException,所以我要添加serialVersionUID可以肯定的整该班正常工作。

问题是,是否有可能添加这样一个字段,而不存在序列化实例中断?它们中有很多,并且没有简单的方法来修改它们。

我的想法来自看到异常消息,这是沿着线的东西:我一直以为我可以使用隐式串行(流classdesc在跟踪)作为串行

java.io.InvalidClassException: the.problematic.Class; local class incompatible: stream classdesc serialVersionUID = -8802277085918151566, local class serialVersionUID = -3137213695071887162" 

,它应该保持向后兼容性。它是否正确?我(或多或少)确定我们在系统中获得的所有序列化实例都是相同的版本。

回答

5

是的,为serialVersionUID指定完全相同的值,因为按is计算应该防止向后兼容(例如Eclipse有一个选项可以做到这一点,称为“添加生成的序列版本ID”)。

+0

我明白了,我不确定这个id的计算方式是在jdk版本中定义和保持不变的 –

1

如果您检查从序列化流中读取的serialVersionUID(简单:只需更改对象并将其读入,异常会告诉您期望的值),您必须小心谨慎,您可以将其放入代码中它将与这个特定的环境一起工作。然而,在其他平台上的另一个JDK(例如IBM vs. SUN)可能具有不兼容的不同serialVersionUID。 (最糟糕的情况是,您需要从支持的VM的已知值列表中计算serialversionuid)。

相关问题