Java Kryo-向后兼容性问题和严格的序列化/反序列化过程
当在多个客户端和一个公共服务器之间的HTTP请求中传递大型java对象时,我们使用Kryo序列化这些对象 例如,我们序列化一个对象,如下所示:Java Kryo-向后兼容性问题和严格的序列化/反序列化过程,java,serialization,deserialization,backwards-compatibility,kryo,Java,Serialization,Deserialization,Backwards Compatibility,Kryo,当在多个客户端和一个公共服务器之间的HTTP请求中传递大型java对象时,我们使用Kryo序列化这些对象 例如,我们序列化一个对象,如下所示: class Person { private long id; private String name; public Person() { } } 现在,我们有两个主要问题,它们会引起很多头痛和额外的编码: 当我们需要更改Person对象(例如添加新字段)时-为了保持与仍然使用oldPerson对象的旧客户端的向后
class Person {
private long id;
private String name;
public Person() {
}
}
现在,我们有两个主要问题,它们会引起很多头痛和额外的编码:
Person
对象(例如添加新字段)时-为了保持与仍然使用oldPerson
对象的旧客户端的向后兼容性-我们创建另一个Person
类(v2.Person
)
然后,我们使用旧的Person
反序列化来自旧客户机的数据,并使用v2.Person
反序列化来自新客户机的数据。这会造成大量代码重复v2.Person
对象移动到另一个包中,会导致如下问题:
假设我将类从旧包.v2.Person
移动到新包.v2.Person
。当我尝试反序列化来自客户端的v2.Person
对象时,我得到ClassNotFoundException:old_pacakge.v2.Person
为了澄清,客户机使用服务器代码创建的依赖项jar中的Person
对象
我知道这是因为在序列化时,kryo写入类名,在反序列化时,它试图在类路径中找到该类,但失败了(因为v2.Person
已移动)
理想情况下,我希望能够序列化具有特定结构的类,并使用另一个具有相同结构但不依赖于类位置的类对其进行反序列化有解决这些问题的标准/最佳实践吗?只是好奇,为什么不使用JSON(或任何其他类似格式)来传递结构呢?使用Jackson、Gson或任何其他库都可以轻松地将JSON转换为类。您可以正确地看到,JSON将更容易序列化/反序列化,但它也是一个更大的对象。对于kryo,序列化字符串要小得多。奇怪的是,为什么不使用JSON(或任何其他类似格式)来传递结构呢?使用Jackson、Gson或任何其他库都可以轻松地将JSON转换为类。您可以正确地看到,JSON将更容易序列化/反序列化,但它也是一个更大的对象。对于kryo,序列化字符串要小得多。