【问题标题】:Is it possible to deserialise a Javers Diff?是否可以反序列化 Javers Diff?
【发布时间】:2017-03-22 18:55:35
【问题描述】:

我正在尝试为现有的遗留系统实现一个简单的差异系统。我正在使用 Javers 计算多个 potential 对象状态之间的差异,并将它们保存在序列化版本中。我不想在我的对象上提交更改,只需跟踪我的差异。

在给定先前序列化的 Diff 的情况下,我有什么方法可以重新创建 Diff 对象?

这是我的用例:

我有一个我不想想要更改的基本实体。系统接收同一实体的新版本,我想知道它们与我的基本实体有何不同。我使用 Javers Diff 发现了差异并可以显示它们,并且显然通过序列化差异来持久化它们,但不能通过序列化差异从数据库中恢复它们。

我想实现相同的一种方法是保留整个更改的替代实体,然后在运行时计算 Diff,但是当只有少数字段发生更改时,似乎没有必要保留整个新实体.由于唯一的键,坚持我的实体的替代版本也会弄乱我现有的系统。

【问题讨论】:

    标签: java javers


    【解决方案1】:

    我找到了正确的方法。我一直在使用 Jackson ObjectMapper 进行序列化/反序列化,这给我带来了问题。

    为了正确序列化和反序列化,我必须使用 Javers 的内部 JsonConverter:

    Diff diff = javers.compare(myObject1, myObject2)
    
    //Tears and pain :(
    String omDiff = objectMapper.writeValueAsString(diff)
    Diff fromOm = objectMapper.readValue(omDiff, Diff.class)
    
    //yay :)
    String jcDiff = jsonConverter.toJson(diff)
    Diff fromJc = jsonConverter.fromJson(jcDiff, Diff.class)
    

    【讨论】:

    • 您好@Solvemon,感谢您分享您的成功。请问,您是如何获得JsonConverter 的实例的?我正在尝试从 JsonConverterBuilder 检索一个,但它在运行时失败:Unable to invoke no-args constructor for class org.javers.core.diff.Change. Register an InstanceCreator with Gson for this type may fix this problem.
    • FIXED - 好的,适用于所有和我做同样事情的人(即调用new JsonConverterBuilder().build())。不要这样做。 :) 只需致电JAVERS.getJsonConverter()。这样,持久性就会为你工作。
    【解决方案2】:

    目前,我们正在开发名为 shadows 的功能。 https://github.com/javers/javers/issues/133。因此,您将能够从保存在 JaversRepository 中的快照中恢复原始域对象。但是从差异中恢复原始对象是不可能的,因为差异只捕获两个状态之间的变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-09
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2023-03-09
      • 2021-11-01
      • 2010-09-19
      相关资源
      最近更新 更多