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对象的旧客户端的向后

当在多个客户端和一个公共服务器之间的HTTP请求中传递大型java对象时,我们使用Kryo序列化这些对象

例如,我们序列化一个对象,如下所示:

class Person {

    private long id;
    private String name;

    public Person() {
    }
}
现在,我们有两个主要问题,它们会引起很多头痛和额外的编码:

  • 当我们需要更改
    Person
    对象(例如添加新字段)时-为了保持与仍然使用old
    Person
    对象的旧客户端的向后兼容性-我们创建另一个
    Person
    类(
    v2.Person

    然后,我们使用旧的
    Person
    反序列化来自旧客户机的数据,并使用
    v2.Person
    反序列化来自新客户机的数据。这会造成大量代码重复

  • 例如,如果我将
    v2.Person
    对象移动到另一个包中,会导致如下问题:

    假设我将类从
    旧包.v2.Person
    移动到
    新包.v2.Person
    。当我尝试反序列化来自客户端的
    v2.Person
    对象时,我得到
    ClassNotFoundException:old_pacakge.v2.Person

    为了澄清,客户机使用服务器代码创建的依赖项jar中的
    Person
    对象

    我知道这是因为在序列化时,kryo写入类名,在反序列化时,它试图在类路径中找到该类,但失败了(因为
    v2.Person
    已移动)

    理想情况下,我希望能够序列化具有特定结构的类,并使用另一个具有相同结构但不依赖于类位置的类对其进行反序列化

  • 我们无法解决这两个问题。我们已经阅读了很多关于Kryo以及人们如何处理向后兼容性问题的文章,但是发现很多人都有同样的问题,并且找不到简单/标准的解决方案


    有解决这些问题的标准/最佳实践吗?

    只是好奇,为什么不使用JSON(或任何其他类似格式)来传递结构呢?使用Jackson、Gson或任何其他库都可以轻松地将JSON转换为类。您可以正确地看到,JSON将更容易序列化/反序列化,但它也是一个更大的对象。对于kryo,序列化字符串要小得多。奇怪的是,为什么不使用JSON(或任何其他类似格式)来传递结构呢?使用Jackson、Gson或任何其他库都可以轻松地将JSON转换为类。您可以正确地看到,JSON将更容易序列化/反序列化,但它也是一个更大的对象。对于kryo,序列化字符串要小得多。