Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,Kryo:将字段作为FieldSerializer添加到类中_Java_Serialization_Kryo - Fatal编程技术网

Java,Kryo:将字段作为FieldSerializer添加到类中

Java,Kryo:将字段作为FieldSerializer添加到类中,java,serialization,kryo,Java,Serialization,Kryo,这是使用Kryo序列化库 我已经用FieldSerializer将对象序列化到数据库。现在,我想向序列化类添加几个字段,并获得与它们的向后兼容性 这可能吗?最好的方法是什么 我尝试将反序列化程序切换到TaggedFieldSerializer,但毫不奇怪,这不起作用(遇到了未注册的类ID:) 那么,有没有一种方法可以使用带有附加字段的同一个类来反序列化这些对象呢 更新1 如果不明显,我希望避免从数据库中删除所有以前序列化的对象。恐怕这是不可能的。发件人: 它不支持添加、删除或更改字段类型 不会

这是使用Kryo序列化库

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

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

我尝试将反序列化程序切换到
TaggedFieldSerializer
,但毫不奇怪,这不起作用(
遇到了未注册的类ID:

那么,有没有一种方法可以使用带有附加字段的同一个类来反序列化这些对象呢


更新1


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

恐怕这是不可能的。发件人:

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


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

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

  • 通过使用
    FieldSerializer
    的Kryo实例将它们全部读入,然后通过支持向后兼容的其他Kryo实例将它们全部写出。即使您没有足够的RAM,也可以考虑暂时增加配置虚拟内存的大小,只是为了增加VM堆大小,但是如果需要大量的交换,处理会慢一些。
如果无法将它们全部保存在内存中:

  • 通过使用
    FieldSerializer
    的Kryo实例一次读取一个,然后通过支持向后兼容的不同Kryo实例一次写入一个,写入具有相同模式的不同表,或具有相同数据库模式作为输入的不同数据库实例(如果在数据库级别更容易做到这一点)
至于选择新的
序列化程序
CompatibleFieldSerializer
将是最简单的,因为序列化转换最初可以在没有任何POJO字段更改的情况下执行。然后,您可以对新的CompatibleFieldSerializer序列化对象进行所需的更改。或者(我没有尝试过),您可以尝试根据
TaggedFieldSerializer
要求对字段进行注释,并遵循相同的步骤-只要FieldSerializer在读取对象时忽略
TaggedFieldSerializer
使用的注释,就可以工作