这是使用Kryo序列化库。
我已经使用FieldSerializer
将对象序列化到数据库。现在,我想在序列化类中添加几个字段,并获得与它们的向后兼容性。
这可能吗?最好的方法是什么?
我尝试将解串器切换为TaggedFieldSerializer
,但不出意外,这不起作用(Encountered unregistered class ID:
)。
那么有没有办法使用相同的类和其他字段反序列化这些对象?
更新1
如果不明显,我想避免从数据库中删除所有以前序列化的对象。
答案 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:
它不支持添加,删除或更改字段类型 不会使先前序列化的字节无效。