Java - 修改二进制序列化对象的serialVersionUID
-
22-07-2019 - |
题
几个月前,我将 java.io.Serializable 对象序列化到文件中。现在我需要读取内容,但从那时起,serialVersionUID 已更改,现在我收到“类不兼容”错误。我知道所有数据成员都没有改变,所以唯一的障碍是serialVersionUID 检查。
有没有办法禁用检查或修改二进制文件中的serialVersionUID?
澄清
这个问题假设我无法编辑源代码。有没有办法可以破解 .class 文件或者破解序列化对象文件(使用十六进制编辑器并更改某个偏移处的值)?
解决方案
作为一个黑客,你可以生成你的JVM可能是使用使用的serialver工具的serialver:
的serialver -classpath任何com.foo.bar.MyClass
如果您再手动设置serialVerUID在类中它应该匹配,你应该能够加载,假设你没有以这样的方式来改变无效的类。
其他提示
为什么不修改当前版本中的serialVersionUID,而是按照 序列化 文档?
最近,我发现自己在类似的情况 - 我有一些序列化对象,我不得不读,这些对象的serialVersionUID
比最新版本不同,在我的情况下,有一对夫妇存储在不同serialVersionUID
s的该文件为同一类(存储在不同的时间,很明显)。所以我没有修改类并设置其serialVersionUID
的奢侈品;其实我不得不去和修改存储的数据。
我想出(通过读取java.io源代码)是一个对象得到由第一存储类名称(使用writeUTF()
)和串行化,然后使用writeLong()
保存serialVersionUID
之后。
我的解决办法是捕捉异常再回去,查找类名和类名后立即更换旧serialVersionUID
新。
据记载,序列化不旨在被用于保存数据。为了获得这些数据后面,你将需要降级的JVM版本是用来输出数据的版本。
有关将来参考,不使用串行化到JVM的会话之间保持数据。