Proto3注意事项

Protobuf3 语法指南:https://colobu.com/2017/03/16/Protobuf3-language-guide/

为什么废弃required和optional

参考资料:https://github.com/protocolbuffers/protobuf/issues/2497

required会破坏protobuf的兼容性语义。protobuf的理念是,它允许您从协议定义中添加/删除字段,同时仍然与新/旧二进制文件完全向前/向后兼容。required字段破坏了此问题,必填字段不能安全地添加到.proto定义中,也不能安全删除现有的必填字段,因为这两个操作都会破坏导线的兼容性。

分配标识号:频繁字段用 [1,15]之内的标识号

正如你所见,在消息定义中,每个字段都有唯一的一个数字标识符。这些标识符是用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变。注:[1,15]之内的标识号在编码的时候会占用一个字节。[16,2047]之内的标识号则占用2个字节。所以应该为那些频繁出现的消息元素保留 [1,15]之内的标识号。切记:要为将来有可能添加的、频繁出现的标识号预留一些标识号。

最小的标识号可以从1开始,最大到2^29 - 1, or 536,870,911。不可以使用其中的[19000-19999]( (从FieldDescriptor::kFirstReservedNumber 到 FieldDescriptor::kLastReservedNumber))的标识号, Protobuf协议实现中对这些进行了预留。如果非要在.proto文件中使用这些预留标识号,编译时就会报警。同样你也不能使用早期保留的标识号

保留标识符(Reserved)

如果你通过删除或者注释所有域,以后的用户在更新这个类型的时候可能重用这些标识号。如果你使用旧版本加载相同的.proto文件会导致严重的问题,包括数据损坏、隐私错误等等。现在有一种确保不会发生这种情况的方法就是为字段tag(reserved name可能会JSON序列化的问题)指定reserved标识符,protocol buffer的编译器会警告未来尝试使用这些域标识符的用户。

message Foo {
  reserved 2, 15, 9 to 11;
  reserved "foo", "bar";
}

注:不要在同一行reserved声明中同时声明域名字和tag number。

可兼容的行为

返回类型:.google.protobuf.Empty => SendFriendRequestByNameRsp

service Friends {
  rpc SendFriendRequestByName(SendFriendRequestByNameReq) returns (.google.protobuf.Empty);
  =>
  rpc SendFriendRequestByName(SendFriendRequestByNameReq) returns (SendFriendRequestByNameRsp);
}

message SendFriendRequestByNameRsp {
    string errorStr = 1;
}

字段名修改

message SendFriendRequestByNameRsp {
    string errStr = 1;
}
=message SendFriendRequestByNameRsp {
    string errorStr = 1;
}

这种方式,json格式不兼容

字段名删除

message SendFriendRequestByNameRsp {
    string errorStr = 1;
    int64 errorID = 2;
}
=message SendFriendRequestByNameRsp {
    // string errorStr = 1;
    int64 errorID = 2;
}

最好用Reserved保留 编号 和 字段名

Copyright © xinyan all right reserved,powered by Gitbook该文件修订时间: 2020-07-24 11:18:27

results matching ""

    No results matching ""