Serialization 使用googleprotobuffer处理delta消息

Serialization 使用googleprotobuffer处理delta消息,serialization,null,protocol-buffers,delta,Serialization,Null,Protocol Buffers,Delta,我正在考虑使用Google Protobuffers进行delta消息传递。这意味着我只想发送域对象的更改值 但这暴露了协议在这方面的问题。我可以很容易地忽略那些没有改变的属性,这将为我们提供一个简洁的消息 但是将值从\u某物更改为null的属性又如何呢?在协议缓冲区中无法区分这两种情况 其他人在这里做了什么?我正在研究几种不同的解决方案: 向所有对象添加元属性,即int数组。如果任何属性应更改为null,请在此数组中包含字段号。如果属性没有改变,那么meta属性只是被省略,不会占用消息中的带宽

我正在考虑使用Google Protobuffers进行delta消息传递。这意味着我只想发送域对象的更改值

但这暴露了协议在这方面的问题。我可以很容易地忽略那些没有改变的属性,这将为我们提供一个简洁的消息

但是将值从
\u某物
更改为
null
的属性又如何呢?在协议缓冲区中无法区分这两种情况

其他人在这里做了什么?我正在研究几种不同的解决方案:

  • 向所有对象添加元属性,即int数组。如果任何属性应更改为null,请在此数组中包含字段号。如果属性没有改变,那么meta属性只是被省略,不会占用消息中的带宽

  • 添加一个元属性,它是位掩码,但与选项1中提到的数组类似。不过,这对客户来说可能更难理解

  • 使用我还没有找到的标准方法


  • BR Jay

    Protobuf 3不太适合这种情况。但在protobuf2中,可以有一个字段存在,但其值为null


    因为protobuf 2不会很快消失,我建议将其用于此类目的。

    我只是想发布一篇后续文章,解释一下我做了什么

    正如@jpa正确指出的,protobuffers不是为增量压缩而设计的

    所以我解决这个问题的方法是使用一些元属性并依赖于这个约定。我与使用数据的人有着密切的合作关系,因此可以就约定达成一致

  • 专门设置为null的值

    我在消息中添加了一个int数组。此int数组大部分时间为空,对消息大小没有影响。当一个属性被设置为null时,我将向这个数组添加属性标记,这样就表明它在消息更新中被专门设置为null

  • 已清空的数组

    这与nulls数组的工作方式相同。我在消息中添加了一个int数组。此int数组大部分时间为空,对消息大小没有影响。当一个数组被清空时,我会将属性标记添加到这个数组中,这样就表明它在消息更新时被清空了

  • 已删除的对象

    为了指示某个对象已被删除,我添加了一个布尔属性,指示该对象已被删除。当对象被删除时,我会将该值设置为true,否则为null,这样它就不会占用消息中的空间。生成的消息是该对象的关键标识符和指示该对象已被删除的布尔值

  • 它要求客户理解该约定,但除此之外,它工作得相当好