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

时间:2015-07-06 15:00:39

标签: java object graph compare

我有一个对象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 上的对象A'

有人知道如何解决此问题或其他任何图书馆用于此用例吗?

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

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

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

编辑:有a spring-synk library。它是为我自己的情况设计的,但我在为对象创建diff时遇到了StackOverflowError。出现此问题是由于我的对象的复杂性,但我暂时不能简化它。改变jvm params并没有帮助。我想知道是否可以将此库用于复杂的对象。

2 个答案:

答案 0 :(得分:0)

您可以发送一个字节,指定接下来要发送的字段。发送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
}

如果字节后跟其值已更改的字段,则会获得一个流。

答案 1 :(得分:0)

我使用了https://github.com/malensek/jbsdiff - 这个库让我得到了我的对象的二进制差异,然后将这个差异应用于对象A的二进制表示。在 server_2 上。关于这个解决方案还有一个时刻 - 如果对象A&#39;很大,它需要大量的内存分配,在我的情况下,它在旧代中分配。