Java,Kryo:将字段添加到持久化为FieldSerializer的类中

时间:2015-03-17 23:12:14

标签: java serialization kryo

这是使用Kryo序列化库。

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

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

我尝试将解串器切换为TaggedFieldSerializer,但不出意外,这不起作用(Encountered unregistered class ID:)。

那么有没有办法使用相同的类和其他字段反序列化这些对象?


更新1

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

2 个答案:

答案 0 :(得分:3)

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

如果你能将它们全部留在记忆中:

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

如果你不能将它们全部记在内存中:

  • 通过使用FieldSerializer的Kryo实例一次一个地读取它们,然后通过支持向后兼容性的不同Kryo实例一次一个地写出它们到具有相同模式的不同表,或者与输入具有相同数据库模式的其他数据库实例(如果在数据库级别更容易执行此操作)。

关于新Serializer的选择,CompatibleFieldSerializer将是最简单的,因为序列化转换最初可以在没有任何POJO字段更改的情况下执行。然后,您可以针对新的CompatibleFieldSerializer序列化对象进行必要的更改。或者(我没有尝试过这个),您可以尝试按照TaggedFieldSerializer要求注释字段,并按照相同的步骤 - 它应该有效,只要FieldSerializer忽略TaggedFieldSerializer使用的注释即可在阅读对象时。

答案 1 :(得分:0)

我担心这是不可能的。来自FieldSerializer’s Javadocs, L55-56

  

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