其他分享
首页 > 其他分享> > proto3学习

proto3学习

作者:互联网

转自:https://colobu.com/2017/03/16/Protobuf3-language-guide/#指定字段类型

1.消息message类型

假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结果。

syntax = "proto3";//指定使用proto3版本,必须在第一行
message SearchRequest {
  string query = 1;//类型、名字、唯一的标示符
  int32 page_number = 2;
  int32 result_per_page = 3;
}

在消息定义中,每个字段都有唯一的一个数字标识符。这些标识符是用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变(?什么意思,不能随意更改吗?)。

对C++来说,当用protocol buffer编译器来运行.proto文件时,编译器会为每个.proto文件生成一个.h文件和一个.cc文件,.proto文件中的每一个消息有一个对应的类。

2.类型

2.1 枚举enum

假设要定义一个Corpus的枚举类型,需要:

  1. 在消息格式中添加了一个叫做Corpus的枚举类型——它含有所有可能的值 ——
  2. 以及一个类型为Corpus的字段:
message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {//可以定义在message外部
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}

 

Corpus枚举的第一个常量映射为0:每个枚举类型必须将其第一个类型映射为0,这是因为:

2.2 map

关联映射:

map<key_type, value_type> map_field = N;

2.3 package

可以为.proto文件新增一个可选的package声明符,用来防止不同的消息类型有命名冲突。

package foo.bar;
message Open { ... }

对于C++,产生的类会被包装在C++的命名空间中,如上例中的Open会被封装在 foo::bar空间中,namespace foo::bar.

在其他的消息格式定义中可以使用包名+消息名的方式来定义域的类型(访问该message类型),如:

message Foo {
  ...
  required foo.bar.Open open = 1;
  ...
}

3.解析默认值

当一个消息被解析的时候,如果被编码的信息不包含一个特定的singular元素,被解析的对象对应的被设置位一个默认值,对于不同类型指定如下:

4.与json的映射关系

空值转换关系:

 

标签:学习,枚举,proto3,消息,类型,message,默认值,Corpus
来源: https://www.cnblogs.com/BlueBlueSea/p/16632759.html