我有一个Serializable
课程,自2004年左右开始在制作中使用。但是,编写它的人忘了生成serialVersionUID
。
整个事情都有效(有一个很大的评论警告,不要触及课堂上的任何内容),但是在一个相关的不同课程中工作时我有一个InvalidCastException
,所以我想添加{ {1}}以确保课程正常运作。
问题是,是否可以添加这样的字段,而不会破坏现有的序列化实例?它们很多,并没有简单的方法来修改它们。
我的想法来自于看到异常消息,这有点像:
serialVersionUID
我认为我可以使用隐式串行(跟踪中的流classdesc)作为序列,它应该保持向后兼容性。它是否正确?我(或多或少)确定我们在整个系统中获得的所有序列化实例都具有相同的版本。
答案 0 :(得分:5)
是的,为计算的on指定serialVersionUID
的完全相同的值应该可以防止向后兼容(例如,Eclipse有一个选项可以做到这一点,称为“添加生成的串行版本ID”)。
答案 1 :(得分:1)
你必须小心,如果你检查从序列化流中读取的serialVersionUID(简单:只需更改对象并读入它,异常将告诉你预期的值)你可以将它放入你的代码和它将适用于这个特定的环境。但是,另一个JDK(例如IBM vs. SUN)在另一个平台上可能具有不兼容的不同serialVersionUID。 (最糟糕的情况是,您需要从支持的VM的已知值列表中计算serialversionuid。)