首页 > 解决方案 > Java Kryo - 向后兼容性问题和严格的序列化/反序列化过程

问题描述

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

例如,我们像这样序列化一个对象:

class Person {

    private long id;
    private String name;

    public Person() {
    }
}

现在,我们有两个主要问题会导致很多头痛和额外的编码:

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

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

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

    说我把班级从old_pacakge.v2.Person搬到new_package.v2.Person. 当我尝试反序列化v2.Person来自客户端的对象时 - 我得到了ClassNotFoundException: old_pacakge.v2.Person.

    澄清 - 客户端使用Person服务器代码创建的依赖项 jar 中的对象。

    我知道这是因为在serialization上,kryo 写入了类名,而在 deserialization 上它试图在类路径中找到该类并失败(因为v2.Person移动了)。

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

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

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

标签: javaserializationdeserializationbackwards-compatibilitykryo

解决方案


推荐阅读