我正在研究使用Google Protobuffers进行增量消息传递。意思我只想发送我的域对象的更改值。
但是为此目的暴露了协议的问题。我可以很容易地省略没有改变的属性,这将为我们提供一个紧凑的消息。
但是,将值从_something_
更改为null
的属性呢?在协议缓冲区中无法区分这两种情况。
其他人在这做了什么?我正在寻找一些不同的解决方案:
将元属性添加到所有对象,即int数组。如果任何属性应更改为null,请在此数组中包含字段编号。如果没有属性更改,则省略元属性,并且不会占用消息中的带宽。
添加一个比特掩码的元属性,但其作用类似于选项1中提到的数组。但客户可能更难理解这一点。
使用我尚未找到的标准方式。
BR Jay
答案 0 :(得分:1)
我只是想对此进行跟进并解释我的所作所为。
正如@jpa正确指出的那样,protobuffers不能用于delta压缩。
所以我解决它的方法是使用一些元属性并依赖于该约定。我与消费数据的人有密切的合作关系,因此可以就约定达成一致。
专门设置为null的值
我在消息中添加了一个int数组。这个int数组在大多数时间都是空的,并且对消息大小没有影响。当一个属性设置为null时,我会将属性标记添加到此数组,并且这表示在该消息更新中已将其特别设置为null。
清空的数组
这与nulls数组的工作方式相同。我在消息中添加了一个int数组。这个int数组在大多数时间都是空的,并且对消息大小没有影响。当一个数组被清空时,我会将属性标记添加到这个数组中,这样就表明它已经特意清空了该消息更新。
已删除的对象
为了表明某个对象已被删除,我添加了一个布尔属性,表明该对象已被删除。删除对象时,我将此值设置为true,否则为null,因此它不占用消息中的空间。结果消息是该对象的密钥标识符,以及指示它被删除的布尔值。
它要求客户理解约定,否则它的效果非常好。
答案 1 :(得分:0)
Protobuf 3不太适合这个。但是在protobuf 2中,你可以有一个存在的字段但值为null。
因为protobuf 2不会很快消失,我建议只是将它用于此类目的。