Java 对象差异:如何将差异应用于对象

Java object diffs: How to apply diffs to an object

我有一个对象 A',它包含 server_1 上的列表、地图和其他集合。然后我将这个对象发送到 server_2

之后 server_1 对象 A' 被更改为状态 A''

重点是 A'' 没有太多变化,而且将整个对象 A'' 发送到 server_2 的成本很高。

因此,如果我想更新 server_2 上的对象 A' 的状态,我必须发送这些对象之间的差异:dA = A'' - A'server_2 然后将 dA 应用到 A'.

我尝试使用两个库来获取 dA:

但现在我很困惑如何将差异 dA 应用于 server_2.[=27= 上的对象 A' ]

有人知道如何解决这个问题或这个用例的任何其他库吗?

编辑: 对象结构示例(此版本比实际对象简单一点):

class Outer {
    SimpleObj val1;
    List<ComplexObj> list;
    Map<String, Map<String, List<OtherComplexObj>> map;
}

在不使用任何库的情况下递归检查所有字段似乎很复杂。

编辑:有a spring-synk library。它是为像我这样的案例设计的,但是我在为我的对象创建差异时遇到了 WhosebugError。由于我的对象的复杂性而出现此问题,但我现在无法简化它。更改 jvm 参数没有帮助。我想知道是否可以将此库用于复杂对象。

您可以发送一个字节来指定接下来要发送的字段。发送0表示发送结束

public void sendDiff(MyClass obj){
    if(!this.field1.equals(obj.field1)){
        send(1) // 1 for field 1
        send(obj.field1)
    }
    if(!this.field2.equals(obj.field2)){
        send(2) // 2 for field 2
        send(obj.field2)
    }
    // et.c for each field
    send(0) // 0 to signify that we have finished sending the changed fields
}

如果字节后跟值已更改的字段,您将获得一个流。

我使用了 https://github.com/malensek/jbsdiff - 这个库让我得到我的对象的二进制差异,然后将这个差异应用于 server_2[= 上对象 A' 的二进制表示14=]。关于这个解决方案有一点——如果对象 A' 很大,它需要大量的内存分配,在我的例子中,它在老一代中分配。