Protobuf3 系列三 更新Message类型

来源:互联网 发布:公司seo是什么职位 编辑:程序博客网 时间:2024/06/13 10:02

如果已经存在的Message类型不能满足要求,比如我们要在Message格式中需要新增一个额外字段,但是我们仍然希望用旧的代码处理新的Message格式。对于这种情况,Protobuf3的有着非常好的支持。更新Message,需要满足以下要求:

  1. 不要改变已经存在的数字标签

    以下.proto中各个字段定义如下:

    • ”string”: 定义字段类型
    • “query”:定义字段名称
    • “1”:表示数字标签;
      string query = 1;  // 1:是数字标签,数字标签一旦被使用不可修改
  2. Message新增一个字段(Fields)后并重新生成新的代码。此时旧的代码对Message序列化的消息,可以被新的代码解析。你需要时刻记住新的值必须设置合适的默认值,这样新的代码可以和旧代码合理交互,相似的,新代码产生的消息,可以被旧代码解析

  3. 在删除Message中字段(Fields)时,需要注意对应的数字标签/字段名称不在后续更新中被再次使用。为了避免将来你误用数字标签/字段名称,可以将这些通过reserved避免被误用。

    message Foo {  reserved 2, 15, 9 to 11; // 预留的字段的数字标签  reserved "foo", "bar"; // 预留的字段的名称}
  4. int32, uint32, int64, uint64, and bool是全兼容,这意味你把字段(Fields)的类型从其中一个类型改变这里面的其它任意一个,是可以向前或向后兼容。但是注意:如果int64被当作int32读取,等价于程序对其值截断为32位,可能出现数据丢失的。

  5. sint32和sint64相互兼容。但是它们不兼容其它的integer类型

  6. string和bytes相互兼容,只要统一使用UTF-8进行编码

  7. flexed32兼容sfixed32,fixed64,sfixed64

  8. enum兼容 int32, uint32, int64, and uint64。对于这个值在转化时,不同语言的客户端处理方式会有所不同

0 1