Java - 修改二进制序列化对象的serialVersionUID

时间:2009-01-14 22:14:13

标签: java serialization serialversionuid

几个月前,我将java.io.Serializable对象序列化为一个文件。现在我需要读取内容,但从那时起serialVersionUID已经改变,现在我得到一个“类不兼容”的错误。我知道没有数据成员发生过变化,因此唯一的障碍是serialVersionUID检查。

有没有办法禁用检查或修改二进制文件中的serialVersionUID?

澄清

这个问题假设我无法编辑源代码。有没有办法可以破解.class文件或者破解序列化目标文件(使用十六进制编辑器并在某个偏移处更改值)?

4 个答案:

答案 0 :(得分:2)

为什么不按照Serialization文档中的说明修改当前版本中的serialVersionUID?

答案 1 :(得分:2)

作为一个hack,你可以使用serialver工具生成你的jvm可能正在使用的serialVer:

serialver -classpath com.foo.bar.MyClass

如果您在类中手动设置serialVerUID它应该匹配并且您应该能够加载,假设您没有以无效方式更改类。

答案 2 :(得分:2)

我最近发现自己处于类似情况 - 我有一些我必须阅读的序列化对象,这些对象的serialVersionUID与最新版本不同,在我的情况下,有几个存储在同一类文件中的不同serialVersionUID(显然存储在不同的时间)。所以我没有修改类并设置其serialVersionUID的奢侈品;我实际上必须进入并修改存储的数据。

我想通过(通过阅读java.io源代码)是通过首先存储类名(使用writeUTF())然后在使用writeLong()之后立即保存serialVersionUID

我的解决方案是捕获异常,然后返回,查找类名,并在类名后立即将旧serialVersionUID替换为新的。{/ p>

答案 3 :(得分:-3)

据记载,序列化不适用于持久化数据。为了获取该数据,您需要将您的JVM版本降级到用于输出该数据的版本。

为了将来参考,请不要使用序列化在JVM的会话之间保留数据。