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

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

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

澄清

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

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

serialver -classpath无论com.foo.bar.MyClass

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

为什么不修改当前版本中的serialVersionUID,如序列化文档中所述?

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

我想通过(通过阅读java.io源代码)得出的是,通过首先存储类名(使用writeUTF() )然后在使用writeLong()保存serialVersionUID之后立即对序列化序列化。

我的解决方案是捕获exception,然后返回,查找类名,并在类名后立即用新的替换旧的serialVersionUID

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

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