2017-03-08 85 views
1

我正试图为现有的遗留系统实现一个简单的差异系统。我正在计算使用Javers的多个潜在对象状态之间的差异,并将它们保存在序列化版本中。我不想在我的对象上进行更改,只是跟踪我的差异。是否有可能对Javers Diff进行反序列化?

是否有任何方法可以重新创建Diff对象,给定先前序列化的Diff?

这里是我的使用情况:

我有一个基础机构,我做想改变。系统接收同一实体的新版本,我想知道它们与我的基本实体有何不同。我发现使用Javers Diff的区别并且可以显示它们,显然通过序列化diff来坚持它们,但不能通过序列化diff从数据库恢复它们。

我想实现这一目标的一种方法是保持整个更改的替代实体,然后在运行时计算Diff,但似乎没有必要持久整个新实体,只有少数字段具有改变。由于唯一的密钥,坚持我的实体的替代版本也会混淆我现有的系统。

回答

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) 
+0

你好@Solvemon,谢谢分享你的成功。请问,你是如何获得'JsonConverter'的实例的?我试图从'JsonConverterBuilder'中检索一个,但是它在运行时失败:'无法为类org.javers.core.diff.Change调用无参数构造函数。对于这种类型的Gson注册一个InstanceCreator可能会解决这个问题。'# –

+0

** FIXED ** - OK,对于每个人来说,都会和我做同样的事情(即调用'new JsonConverterBuilder()。build()')。不要这样做。 :)只需调用'JAVERS.getJsonConverter()'。这样的持久性将为你工作。 –

0

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

相关问题