计算对象差异

3
我正在开发一个应用程序,客户端和服务器共享一个对象模型,对象图可能会变得相当大。
为了将对象从客户端保存到服务器,理想情况下我希望只发送差异以最小化网络流量。我可以在服务器上获取原始对象图并对其应用增量。
想知道是否有任何工具或项目可以实现这样的功能,或者是否有人有相关经验...
非常感谢

我还发现了一个类似的问题 - HappyNomad
我找到了另一个类似的问题 - HappyNomad
3个回答

4
在之前的工作中,我们有一些大型的三维模型需要在客户之间共享。考虑到模型的大小和带宽限制,保存实际模型更改是不可能的。
因此,我们选择对数据进行序列化的方式来共享模型变化。例如,一个操作可能是{CUT plane: (pt1, pt2, pt3)}或者{DRILLHOLE(point, radius, depth)}。虽然这种方法非常适合我们的应用程序,但可能并不适用于你的模型。
此外,马修的建议——计算哈希值或时间戳也是个好主意。另外,您还可以保留一个唯一键的哈希表,这样服务器就知道哪些被删除了,哪些被添加了。

1
您可以通过让您的对象能够根据其属性值计算自身哈希来节省一些带宽。比较服务器对象哈希和客户端对象哈希,如果它们不同,则更新相应的哈希。

同样地,您可以使用时间戳甚至是脏标志。 - Steven Sudit

0

我正在计划我的第一个N层架构,在我准备发布类似问题时,遇到了这个问题。到目前为止,我看到的所有示例代码都是每次都通过网络传递整个对象图,而不考虑实际进行了哪些更改。我一直在考虑采用上述方法。尽管如此,它似乎是不太常见的做法。

我喜欢仅传回每个修改属性的增量的想法。对于集合属性,这将是已添加和已删除的内容。对于单值属性,它可以只是新值。我可以以通用方式实现这一点,使得所有域对象的这些增量的累积对于所有域对象都是透明的。并且增量将以通用形式通过网络发送,而不使用特定于我的域模型的DTO类。

这让我想到是否可以进一步利用同样的通用增量数据结构,用于服务器到客户端的通信。毕竟,您可以有一个基本上填充空对象的增量。然后,我可以完全消除硬编码的DTO类。我谷歌搜索了“通用DTO”(不带引号),找到了thisthis。看起来其他人已经将这个想法应用到实践中了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接