我正在开发一个客户端和服务器共享对象模型的应用程序,对象图可能变得相当大。
要将对象从客户端保存到服务器,理想情况下我只希望通过线路发送差异,以最大限度地减少网络流量。我可以在服务器上提取原始对象图并将delta应用于它
想知道是否有任何工具或项目,或者是否有人有过这样做的经验..
非常感谢答案 0 :(得分:4)
在之前的工作中,我们想要在客户之间共享大型3D模型。鉴于模型尺寸和带宽限制,要保存实际模型更改是不可能的。
我们选择在数据上序列化操作,而不是发送整个已更改的模型。例如,操作可能是{CUT plane:(pt1,pt2,pt3)}或{DRILLHOLE(point,radius,depth)}。这对我们的应用程序非常有用,但它可能不适合您的模型。
另外,马修建议计算哈希值或时间戳是一个很好的建议。此外,也许您可以保留唯一键的哈希表,以便服务器知道删除了哪些以及添加了哪些键。
答案 1 :(得分:1)
您可以通过让对象根据其属性值计算自己的哈希值来节省一些带宽。将服务器对象哈希值与客户端对象哈希值进行比较,如果它们不同,请更新相应的哈希值。
答案 2 :(得分:0)
我正在计划我的第一个N层架构并且遇到了这个问题,正如我即将发布一个类似的问题。到目前为止,我看到的所有示例代码每次都通过线路传递整个对象图,而不考虑实际进行了哪些更改。我一直在考虑采用上述方法。虽然,它似乎是少走过的路。
我喜欢传回每个修改过的属性的增量的想法。对于集合属性,这将是添加和删除的内容。对于单值属性,它可能只是新值。我可以以一般方式实现这一点,使得这些增量的累积对于所有域对象都是透明的。并且这些增量将以通用形式通过网络发送,而不使用特定于我的域模型的DTO类。
这让我想知道我是否也无法通过在服务器到客户端的方向上使用相同的通用增量数据结构来进一步理解这个想法。毕竟,你可以有一个基本上填充空对象的delta。然后我可以完全消除硬编码的DTO类。我用Google搜索了“通用DTO”(没有引号),找到了this和this。看起来其他人已经在实践中应用了这个想法。