java - Java Kryo - 向后兼容性问题和严格的序列化/反序列化过程
问题描述
当在多个客户端和一个公共服务器之间的 HTTP 请求中传递大型 Java 对象时,我们使用 Kryo 序列化它们。
例如,我们像这样序列化一个对象:
class Person {
private long id;
private String name;
public Person() {
}
}
现在,我们有两个主要问题会导致很多头痛和额外的编码:
当我们需要更改
Person
对象时(例如添加新字段) - 为了保持与仍然使用旧Person
对象的旧客户端的向后兼容性- 我们创建另一个Person
类 (v2.Person
)。然后我们使用 old 反序列化来自旧客户端的数据
Person
,并使用v2.Person
. 这会产生大量代码重复。例如,如果我将
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 以及人们如何处理向后兼容性问题的文章,但发现很多人有同样的问题并且找不到简单/标准的解决方案。
是否有解决这些问题的标准/最佳实践?
解决方案
推荐阅读
- c - C 字符串指针。int 指针 vs char 指针
- python - 为什么在这个简单的python函数中IDE会出现未绑定变量错误警告
- javascript - setTimeout 的重播按钮
- python - 在 imagenet 数据集(inceptionv3)上预训练的卷积神经网络在 ternsorflow 中引发了 ValueError
- javascript - 如何配置 webpack.config.js 以将我的 HTML 文件转换/转换为 reactjs 中的 JS?
- google-cloud-platform - 无法在 GCP 帐户中创建存储桶。获取服务帐户的访问令牌时出错:来自服务器的文件意外结束
- google-cloud-platform - Google CDF:我们可以将列的值设置为运行时参数吗?
- android - 无法在android中显示进度对话框
- javascript - 有没有一种仅使用 JavaScript 将 JSON 数据附加到 div 的好方法?
- javascript - 如何将数组中的日期字符串更新为mongoDB中的日期格式?