作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这是使用 Kryo 序列化库。
我已经使用 FieldSerializer
将对象序列化到数据库中。现在,我想向序列化类添加几个字段,并获得与它们的向后兼容性。
这可能吗?最好的方法是什么?
我尝试将反序列化器切换为 TaggedFieldSerializer
,但毫不奇怪,这不起作用(遇到未注册的类 ID:
)。
那么有没有一种方法可以使用具有附加字段的相同类来反序列化这些对象?
更新 1
如果它不明显,我想避免从数据库中删除所有以前序列化的对象。
最佳答案
我想到了几种方法(取决于它们是否可以同时保存在 JVM 进程内存中)。但是,在添加新字段之前,您必须完成此过程:
如果你能把它们全部记在内存中:
FieldSerializer
的 Kryo 实例将它们全部读入,然后通过支持向后兼容的不同 Kryo 实例将它们全部写出。即使您没有足够的 RAM,您也可以考虑暂时增加为此练习配置的虚拟内存大小并增加 VM 堆大小,但如果需要大量交换,处理速度会变慢。如果你无法将它们全部保存在内存中:
FieldSerializer
的 Kryo 实例一次一个地读取它们,然后通过另一个支持向后兼容的 Kryo 实例将它们一次一个地写出到不同的表中相同的架构,或具有与输入相同的数据库架构的不同数据库实例(如果在数据库级别更容易执行此操作)。至于新的Serializer
的选择,CompatibleFieldSerializer
将是最简单的,因为序列化转换最初可以在没有任何POJO字段变化的情况下执行。然后您可以对新的 CompatibleFieldSerializer 序列化对象进行所需的更改。或者(我还没有尝试过),您可以尝试根据 TaggedFieldSerializer
要求对字段进行注释,并按照相同的步骤操作 - 它应该可以工作,只要 FieldSerializer 忽略 使用的注释>TaggedFieldSerializer
读入对象。
关于Java、克里奥 : Add fields to class persisted as FieldSerializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111435/
我是一名优秀的程序员,十分优秀!