美文网首页
Protobuf 3完整示例

Protobuf 3完整示例

作者: XBruce | 来源:发表于2020-03-31 13:21 被阅读0次
syntax = "proto3";
import "google/protobuf/any.proto";
package XBruce.Protobuf;

service SearchService {
  rpc GetBooks(GetBooksRequest) returns (GetBooksResponse);
}

message Book
{
    enum BookType{
      reserved 2, 15, 9 to 11, 40 to max;
      reserved "Chinese", "English";
      UNIVERSAL = 0;
      WEB = 1;
      LOCAL = 3;
      NEWS = 4;
      PRODUCTS = 5;
    }
    message BookWriter{
      string name = 1;
      string tel = 2;
    }
    string name = 1;
    int32 pages = 2;
    float price = 3;
    bytes content = 4;
    google.protobuf.Any object = 5;
    repeated BookWriter authors = 6;
    reserved 7;
}

message GetBooksRequest{
  int requestId = 1;
  Book.BookType book_type = 2;
  Book.BookWriter author = 3;
}

message GetBooksResponse{
  int requestId = 1;
  map<string, Book> books= 2;
}

map使用注意事项:

key_type 可以是任何 int 或者 string 类型(任何的标量类型,具体可以见上面标量类型对应表格,但是要除去 float、double 和 bytes)
枚举值也不能作为 key。
key_type 可以是除去 map 以外的任何类型。
需要特别注意的是 :
map 是不能用 repeated 修饰的。
线性数组和 map 迭代顺序的是不确定的,所以你不能依靠你的map 是在一个特定的顺序。
为 .proto 生成文本格式时,map 按 key 排序。数字的 key 按数字排序。
从数组中解析或合并时,如果有重复的 key,则使用所看到的最后一个 key(覆盖原则)。从文本格式解析映射时,如果有重复的 key,解析可能会失败。
Protocol Buffer 虽然不支持 map 类型的数组,但是可以转换一下,用以下思路实现 maps 数组:

message MapFieldEntry {
  key_type key = 1;
  value_type value = 2;
}
repeated MapFieldEntry map_field = N;

message 采用驼峰命名法。message 首字母大写开头。字段名采用下划线分隔法命名。

image.png

相关文章

网友评论

      本文标题:Protobuf 3完整示例

      本文链接:https://www.haomeiwen.com/subject/ruziuhtx.html