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

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

澄清

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

有帮助吗?

解决方案

作为一个黑客,你可以生成你的JVM可能是使用使用的serialver工具的serialver:

的serialver -classpath任何com.foo.bar.MyClass

如果您再手动设置serialVerUID在类中它应该匹配,你应该能够加载,假设你没有以这样的方式来改变无效的类。

其他提示

为什么不修改当前版本中的serialVersionUID,而是按照 序列化 文档?

最近,我发现自己在类似的情况 - 我有一些序列化对象,我不得不读,这些对象的serialVersionUID比最新版本不同,在我的情况下,有一对夫妇存储在不同serialVersionUIDs的该文件为同一类(存储在不同的时间,很明显)。所以我没有修改类并设置其serialVersionUID的奢侈品;其实我不得不去和修改存储的数据。

我想出(通过读取java.io源代码)是一个对象得到由第一存储类名称(使用writeUTF())和串行化,然后使用writeLong()保存serialVersionUID之后。

我的解决办法是捕捉异常再回去,查找类名和类名后立即更换旧serialVersionUID新。

据记载,序列化不旨在被用于保存数据。为了获得这些数据后面,你将需要降级的JVM版本是用来输出数据的版本。

有关将来参考,不使用串行化到JVM的会话之间保持数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top