几个月前,我将java.io.Serializable对象序列化为一个文件。现在我需要读取内容,但从那时起serialVersionUID已经改变,现在我得到一个“类不兼容”的错误。我知道没有数据成员发生过变化,因此唯一的障碍是serialVersionUID检查。
有没有办法禁用检查或修改二进制文件中的serialVersionUID?
澄清
这个问题假设我无法编辑源代码。有没有办法可以破解.class文件或者破解序列化目标文件(使用十六进制编辑器并在某个偏移处更改值)?
答案 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的会话之间保留数据。