我正在尝试实现一个用于通过TCP同步对象更改的系统。我希望这是一个通用系统,我可以用于许多不同的对象。在这种情况下,对象是一组键值对,一个对象数组或一个字符串到对象的映射。对象结构很少更改,但值每秒更改多次。
我正在尝试实现只发送更改的内容,而不是每次更改时序列化整个对象,以便我可以减少带宽需求并减少延迟。
我现在正在考虑的是这样的事情:
[ { a: 5, b: "abc"}, { a: 3, b: "xyz" } ]
成一组一维数组:
values = [ 5, "abc", 3, "xyz" ]
objects = [ { a: 0, b: 1 }, { a: 2, b: 3 } ]
conainer = [ [ 0, 1 ] ]
整数指向三个数组之一中的另一个元素。哪些元素指向提前发送的内容,不应更改。当值发生变化时,唯一需要发送的是value数组中的索引和新值。
我觉得我大概过度思考这个问题(读:我很确定我的这个数字要比它需要的复杂百万倍)。如果我可以对对象结构进行硬编码,那将非常容易。我开始实现上面描述的系统,但是它变得如此复杂以至于我觉得必须有一种更简单的方法来做到这一点,这不涉及在它发生变化时重新发送整个对象。
编辑:好像我没有很好地解释自己。我还有另一个去:
我需要通过互联网将更改发送到对象/模型/数据结构/您要调用它的任何内容(我在本文的其余部分使用对象)。由于对象中的值变化很大,但结构很少我只想发送更改,而不是每次都序列化整个对象,如果一个整数增加一个,则通过网络发送整个对象。
此对象在编译时没有已知结构,因此我无法对其进行硬编码。在运行时,结构是已知的,只有值会发生很大变化。
例如,对象可能如下所示:
Foo {
int a, b, c
}
Bar {
Foo[] foos = { ... }
int a, b, c
}
Baz {
map<string, Bar> bars = { ... }
}
此结构在发送更改之前将是已知的,并且在程序运行时不会更改,但在编译时不知道。 (可以由用户更改)