代码之家  ›  专栏  ›  技术社区  ›  bajafresh4life

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

  •  2
  • bajafresh4life  · 技术社区  · 16 年前

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

    是否有方法禁用检查或修改二进制文件中的serialVersionUID?

    澄清

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

    4 回复  |  直到 15 年前
        1
  •  2
  •   Steve B.    16 年前

    作为一种技巧,您可以使用serialVer工具生成jvm可能正在使用的serialVer:

    serilver-无论com.foo.bar是什么类路径。类名

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

        2
  •  2
  •   Jon Skeet    16 年前

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

        3
  •  2
  •   daniel daniel    16 年前

    我最近发现自己也处于类似的情况——我必须读取一些序列化对象 serialVersionUID 其中一些对象与最新版本不同,就我而言,有几个不同 serialVersionUID s存储在同一类的文件中(显然存储在不同的时间)。所以我没有机会修改类并设置它 serialVersionUID ;我实际上不得不进去修改存储的数据。

    我发现(通过阅读java.io源代码),对象通过首先存储类名(使用 writeUTF() )然后在使用后立即 writeLong() 为了拯救 serialVersionUID .

    我的解决方案是捕获异常,然后返回,查找类名,并在类名之后立即替换旧的 serialVersionUID 随着新。

        4
  •  -3
  •   Matthew Brubaker    16 年前

    有文件证明序列化不是用于持久化数据的。为了获取该数据,您需要将JVM的版本降级到用于输出该数据的版本。

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