将serialVersionUID添加到已在使用的可序列化类中

时间:2011-08-02 14:47:46

标签: java serialization legacy

我有一个Serializable课程,自2004年左右开始在制作中使用。但是,编写它的人忘了生成serialVersionUID

整个事情都有效(有一个很大的评论警告,不要触及课堂上的任何内容),但是在一个相关的不同课程中工作时我有一个InvalidCastException,所以我想添加{ {1}}以确保课程正常运作。

问题是,是否可以添加这样的字段,而不会破坏现有的序列化实例?它们很多,并没有简单的方法来修改它们。

我的想法来自于看到异常消息,这有点像:

serialVersionUID

我认为我可以使用隐式串行(跟踪中的流classdesc)作为序列,它应该保持向后兼容性。它是否正确?我(或多或少)确定我们在整个系统中获得的所有序列化实例都具有相同的版本。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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