Java中对象列表之间的最佳差异

Java中对象列表之间的最佳差异,java,diff,Java,Diff,我的服务器上有一个Java对象列表,通过某种序列化机制发送给客户机。偶尔会在服务器上更新对象列表,也就是说,一些对象会被添加,一些对象会被删除,而其他对象只会更改它们在列表中的位置。我也想在客户端更新列表,但是发送尽可能少的数据。特别是,我不想重新发送客户端上已经可用的对象 是否有一个库可以从两个列表中产生某种差异,这样我只能通过网络发送差异和新对象 我发现了几个unix diff命令的Java实现,但是这种算法对于顺序更改不实用。也就是说,[A,B,C]->[C,B,A]可以作为唯一的位置更改

我的服务器上有一个Java对象列表,通过某种序列化机制发送给客户机。偶尔会在服务器上更新对象列表,也就是说,一些对象会被添加,一些对象会被删除,而其他对象只会更改它们在列表中的位置。我也想在客户端更新列表,但是发送尽可能少的数据。特别是,我不想重新发送客户端上已经可用的对象

是否有一个库可以从两个列表中产生某种差异,这样我只能通过网络发送差异和新对象


我发现了几个unix diff命令的Java实现,但是这种算法对于顺序更改不实用。也就是说,[A,B,C]->[C,B,A]可以作为唯一的位置更改[1->3][3->1]发送,而diff将希望重新发送整个A和C对象(据我所知)。

我将通过使对象的公共接口(无论它们在哪里被修改),保持所做更改的日志,即,将表示每个修改的对象添加到修改列表中

这样,您就有了一个发送到另一台机器的精确更改的最小列表,而不需要通过比较新旧来使用容易出错的猜测来推断它们

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

您可以“假装”列表是字符串,并使用查找将一个列表转换为另一个列表所需的最小操作,允许插入、删除、替换和转置(这就是你的例子所暗示的)


我不知道有成熟和/或稳定的实现,即使有,也可能是针对字符串的,因此适应抽象值类型的列表将是一个挑战。实现自己的也可能是一个挑战性的任务,但肯定是可行的。

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

这当然不如优化算法漂亮,但有一个预期的结果:昂贵的对象只通过网络发送一次。

JaVers lib()完成这项工作

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

Diff包含更改列表,如:添加对象、删除对象、更改索引

好方法,但此解决方案不是没有缩减步骤的最小解决方案。例如,如果添加并随后删除元素,则不应通过连线发送该元素。(顺便说一句,很抱歉响应太晚)谢谢你的参考。我在网上找到的D-L算法的实现似乎不可靠,我自己写的对我的问题来说有点过分了。