【问题标题】:Redis object serialization backwards compatibilityRedis 对象序列化向后兼容
【发布时间】:2014-08-15 02:15:59
【问题描述】:

我们将以下java实体序列化并存储到Redis中:

public class Foo {
    public String bar;
}

然后我们的应用程序 v2 将 Foo 类修改为:

public class Foo {
    public String bar;
    public Integer eggs;
    public Datetime happen;
}

现在,当应用程序 v2 投入生产时,在 Redis 中,序列化 Foo V1 和序列化 Foo V2 都会被存储,因此我们的应用程序在从 Redis 反序列化对象时会收到异常.现在我破坏了向后兼容性。

由于业务原因,当我们的应用从v1升级到v2时,不允许清理Redis中的对象。

在设计 Redis 数据对象时,哪种方法是避免此类向后兼容性问题的最佳做法?谢谢。

【问题讨论】:

  • 这似乎不是 Redis 本身的问题,因为我已经从 c# 完成了此操作,而可能是您的 redis 客户端的问题。您遇到的具体错误是什么?
  • 同意@Fred,这是关于你如何序列化和版本化你的注入而不是 Redis。您需要更具体地了解如何进行序列化。您是将其存储为 JSON、BSON、使用 msgpack、转换为自定义字符串表示还是其他方式?如果没有这些细节,您最希望得到的是一个通用的“搜索 google 以将 java 对象序列化为字符串”指针。
  • @Fred,真正的比尔,你们是对的,实际上这是一个对象映射和序列化问题

标签: java c# serialization backwards-compatibility


【解决方案1】:

我认为你可以通过配置你的 JSON 库来修复它

如果您使用的是Jackson library,您可以选择使用

忽略未知属性
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

如果您使用gson 库,您可以使用它作为版本的一个很酷的功能,通过使用@Version 注释来注释您的java 类,它使您可以灵活地让两个不同版本的JSON 共存在一起

希望对你有帮助

【讨论】:

  • 我自己解决了这个问题。这是客户端反序列化问题,我已修复。谢谢。
猜你喜欢
  • 2011-07-19
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 2019-12-08
相关资源
最近更新 更多