2009-01-14 57 views
1

几个月前,我将一个java.io.Serializable对象序列化为一个文件。现在我需要阅读这些内容,但自此之后,serialVersionUID发生了变化,现在我得到了“类不兼容”错误。我知道数据成员都没有改变,所以唯一的障碍是serialVersionUID检查。Java - 修改二进制序列化对象的serialVersionUID

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

澄清

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

回答

2

作为一个黑客,你可以生成你的JVM可能是使用使用的serialver工具的serialver:无论com.foo.bar.MyClass

如果然后手动设置serialVerUID在

的serialver -classpath你的班级应该匹配,你应该能够加载,假设你没有改变班级的方式使其无效。

-3

有文件证明,序列化不打算用于持久数据。为了恢复这些数据,您需要将您的JVM版本降级到用于输出该数据的版本。

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

+0

只要您设置serialVersionUID,您就可以*以这种方式使用序列化。从Serializable文档 - “因此,为了保证在不同的java编译器实现中保持一致的serialVersionUID值,可序列化的类必须声明一个显式的serialVersionUID值。” – CurtainDog 2009-04-16 13:19:04

+0

这可能是真实的,考虑到如果您更新课程,则无法访问并获取数据。你所要做的就是将数据加载到你的类的未更新版本中,并将它传递给新类并再次序列化(在运行时),这在大多数情况下不可行。 – mostruash 2013-02-22 13:49:06

2

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

+0

他的问题被写入的方式表明该对象不在他的控制之下以便能够进行此更改。 – 2009-01-14 22:21:50

2

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

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

我的解决方案是捕捉异常,然后回去查找类名,并在类名后立即用新的替换旧的serialVersionUID