2009-08-27 70 views
3

我正在处理客户端和服务器共享对象模型的应用程序,并且对象图可能变得相当大。计算对象增量

要从客户端到服务器保存一个对象,理想情况下,我只想通过线路发送差异,以尽量减少网络流量。我可以拉动服务器上的原始对象图和增量适用于它

想知道是否有任何工具或项目,在那里或是否有人曾与做这样的事的经验..

千恩万谢

+0

我还发现了一个[类似的问题](http://stackoverflow.com/q/8714463)。 – HappyNomad 2013-11-18 12:32:24

+0

我发现了另一个[类似的问题](http://stackoverflow.com/q/1746864)。 – HappyNomad 2013-12-02 08:08:59

回答

4

在之前的工作中,我们想要在客户之间共享大型三维模型。考虑到模型尺寸和带宽限制,为了节省实际的模型更改是不可能的。

而不是发送整个更改的模型,我们选择序列化操作上的数据。例如,一个操作可能是{CUT平面:(pt1,pt2,pt3)}或{DRILLHOLE(点,半径,深度)}。这对我们的应用程序非常有用,但它可能不适合您的模型。

此外,马修的计算哈希或时间戳的建议是一个很好的建议。此外,也许你可以保留唯一密钥的哈希表,以便服务器知道哪些被删除,哪些被添加。

1

通过让对象能够根据属性值计算自己的哈希值,您可以节省一些带宽。将服务器对象散列与客户端对象散列进行比较,如果它们不同,请更新相应的散列。

+0

同样,您可以使用时间戳或脏标志。 – 2009-08-27 22:48:11

0

我正在计划我的第一个N层架构,并且遇到了这个问题,就像我准备发布类似的问题一样。到目前为止,我所见过的所有示例代码都是每次都通过网络传递整个对象图,而不考虑实际做了哪些更改。我一直在考虑采取上述方法。虽然,它似乎是少走的路。

我喜欢为每个修改后的属性传回只是增量的想法。对于收藏属性,这将被添加和删除。对于单值财产,它可能只是新的价值。我可以通过一般方式实现这一点,这些增量的积累对于所有域对象都是透明的。而增量将以一般形式通过网络发送,而不使用特定于我的域模型的DTO类。

这让我想知道,如果我还不能通过在服务器到客户端的方向上使用相同的通用增量数据结构进行通信,从而无法进一步实现这个想法。毕竟,你可以有一个基本上填充空对象的delta。然后,我可以完全消除硬编码的DTO类。我谷歌搜索“通用DTOs”(不含引号),发现thisthis。看起来其他人已经在实践中应用了这个想法。