【问题标题】:Java, Kryo: Add fields to class persisted as FieldSerializerJava,Kryo:向持久化为 FieldSerializer 的类添加字段
【发布时间】:2015-03-17 23:12:13
【问题描述】:

这是使用 Kryo 序列化库。

我已经使用FieldSerializer 将对象序列化到数据库中。现在,我想向序列化类添加几个字段,并获得与它们的向后兼容性。

这可能吗?最好的方法是什么?

我尝试将反序列化器切换为 TaggedFieldSerializer,但并不奇怪,这不起作用 (Encountered unregistered class ID:)。

那么有没有办法使用带有附加字段的同一个类来反序列化这些对象?


更新 1

如果不明显,我想避免从数据库中删除所有以前序列化的对象。

【问题讨论】:

    标签: java serialization kryo


    【解决方案1】:

    我想到了几种方法(取决于它们是否可以同时保存在 JVM 进程内存中)。但是,在添加新字段之前,您必须完成此过程:

    如果你能把它们全部记住:

    • 通过使用FieldSerializer 的 Kryo 实例将它们全部读入,然后通过支持向后兼容性的不同 Kryo 实例将它们全部写出。即使您没有足够的 RAM,您也可以考虑暂时增加已配置的虚拟内存的大小,仅用于本练习并增加 VM 堆大小,但如果需要大量交换,处理速度会变慢。

    如果您无法将它们全部保存在内存中:

    • 通过使用FieldSerializer 的 Kryo 实例一次读取它们,然后通过支持向后兼容性的不同 Kryo 实例一次将它们写入到具有相同架构的不同表中,或具有与输入相同的数据库架构的不同数据库实例(如果在数据库级别更容易做到这一点)。

    至于选择新的SerializerCompatibleFieldSerializer 将是最简单的,因为序列化转换最初可以在没有任何 POJO 字段更改的情况下执行。然后,您可以对新的 CompatibleFieldSerializer 序列化对象进行所需的更改。或者(我还没有尝试过),您可以尝试根据TaggedFieldSerializer 要求对字段进行注释,并按照相同的步骤进行操作 - 只要 FieldSerializer 在阅读时忽略 TaggedFieldSerializer 使用的注释对象。

    【讨论】:

      【解决方案2】:

      恐怕这是不可能的。来自FieldSerializer’s Javadocs, L55-56

      不支持添加、删除或更改字段类型 不会使先前序列化的字节无效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多