4

这是使用 Kryo 序列化库。

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

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

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

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


更新 1

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

4

2 回答 2

3

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

如果您可以将它们全部保存在内存中:

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

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

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

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

于 2015-11-06T21:37:32.083 回答
0

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

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

于 2015-05-27T18:28:08.850 回答