2010-04-16 63 views
3

我有我的服务器上的Java对象列表,通过一些序列化机制发送到客户端。偶尔List对象在服务器上得到更新,也就是说,一些对象被添加,一些被删除,而其他对象只是改变他们在List中的位置。我也想在客户端更新列表,但发送尽可能少的数据。特别是,我不想重新发送客户端上已有的对象。Java中的对象列表之间的最佳差异

是否有可用的库会产生某种差异从这两个列表,所以我只能发送差异和新的对象横跨电线?

我发现了unix diff命令的几个Java实现,但是这个算法对于更改顺序是不实用的。即。 [A,B,C] - > [C,B,A]可以发送,因为只有地方发生变化[1-> 3] [3-> 1],而差异则希望重新发送整个A和C对象据我所知)。

回答

0

现在我只是发送完整的列表而不是对象,我只使用唯一的ID。如果客户端本地没有该对象,则使用该ID请求它。

这绝对不如最佳算法的美丽,但具有预期的结果:昂贵的对象只在线上发送一次。

3

我会这样做,通过使对象的公共接口无论在哪里进行静默修改都保留所做更改的日志,即将表示每个修改的对象添加到修改列表中。

通过这种方式,您可以获得发送给其他机器的确切更改的最小列表,而不需要通过比较旧版本与新版本来使用错误的猜测来推断它们。

要创建对象模型以便自动记录对自身的更改,您可能会从某些代码生成或AOP中受益,以避免大量重复模式。设置属性值或从列表中添加/删除的方法都需要调用对象层次结构共享的中央日志。

+0

好方法,但这种解决方案不是最小的,而不还原步骤。例如。如果添加并稍后移除元素,则不应通过电线发送该元素。 (BTW对于迟到的回复感到抱歉) – Philipp 2010-04-19 06:41:09

3

你可以“假装”,你的列表是一个字符串,并使用Damerau–Levenshtein distance找到所需的最低操作变换另一个人,允许插入,删除,替换和换位(这是你的例子说明了什么) 。

我不知道成熟和/或稳定的实现,即使存在,它可能是针对字符串,所以适应抽象值类型列表将是一个挑战。实施你自己也可能是一项具有挑战性的任务,但这当然是可行的。

+0

感谢您的参考。我在网上找到的D-L算法的实现似乎不可靠,写我自己对我的问题有点矫枉过正。 – Philipp 2010-04-19 19:38:11

1

JaVers lib(http://javers.org)完成这项工作。

Diff diff = javers.compare(list1, list2); 

DIFF包含样改变的列表:添加对象的,对象去除的,折射率改变