protobuf相关的小知识

一直很好奇protobuf结构怎么修改才会导致无法向前向后兼容,上google查了一下,为了保证向前以及向后的兼容性:修改.proto文件必须依据一下四个原则

  • you must not change the tag numbers of any existing fields.
  • you must not add or delete any required fields.
  • you may delete optional or repeated fields.
  • you may add new optional or repeated fields but you must use fresh tag numbers (i.e. tag numbers that were never used in this protocol buffer, not even by deleted fields).

proto文件中每个字段分别可能是 required, optional,repeated三种类型,并且每个字段都有一个唯一标识tag。protobuf在parsing(解析数据)时,在旧代码处会跳过新的tag字段,但是数据并不会删除,同样的数据再在新代码处parsing时,会得到正确的数据。如果你是通过一个code generator产生的proto文件,可以通过加字段得到新的proto文件,与之前的对比,如果违反了以上任何的规则,就会导致前后兼容性的问题。

一般来说,删除的字段在是使用code generator时,总会导致其他字段的tag(往往自动生成)发生变化,因此在更新时尽量避免删除字段。

如果一个message结构(A),被另一个B包含(即B{A a,int num, ...}),直接往A添加字段一般不会改变B中的字段的tag值,因此具有兼容性。

使用code generator时,数组的大小限制了整块数据的空间上限,你可以扩大上限保证兼容性(旧代码一定只会读取<=旧空间大小的数据),但是缩小就会导致兼容性问题(旧空间>新空间,旧空间>旧代码读取的空间,所以旧代码读取的空间新空间大小关系未知,从而旧代码可能读取了超过新空间大小的空间造成读取了错误数据,甚至后面的数据读歪)。

猜你喜欢

转载自www.cnblogs.com/noprofessional/p/9593193.html