我有一个对象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并没有帮助。我想知道是否可以将此库用于复杂的对象。
答案 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;很大,它需要大量的内存分配,在我的情况下,它在旧代中分配。