参考官网:Overview | Protocol Buffers | Google Developers

名字与生成文件

定义:name.proto 生成:name.pb.语言类型

proto文件例子

syntax = "proto2";	//使用的是什么版本的语法
package tutorial;	//编译之后,这个就是命名空间

message Person {
  optional string name = 1;
  optional int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    optional string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}

语法格式:修饰符 消息类型 字段名 = 唯一的编号标签

修饰符

​proto3去掉了required描述符,不加描述符,默认就是required的。

  • optional:这个字段可能被赋值也可能没有,如果没有被赋值,会有一个默认值.
  • repeated:相当于一个数组,可以被重复赋值
  • required:必须处理的字段

消息类型

​message就是表示一个类!这个message里面有什么字段自己定义就行。

唯一标签号:

不能重复,频繁使用的放在1-15。标签范围是1-229。

定义rpc方法

使用map

在 Protobuf 中,使用 map 类型可以表示键值对映射。要使用 map 类型,需要在 .proto 文件中使用 map<key_type, value_type> 定义字段。

例如,如果要定义一个包含字符串键值对的 map 类型的字段,可以这样写:

message MyMessage {
  map<string, int32> my_map = 1;
}

在使用时,可以像使用普通的 std::map 一样使用这个字段。例如,下面是一个将键值对插入到 map 中的示例:

MyMessage message;
message.mutable_my_map()["key1"] = 1;
message.mutable_my_map()["key2"] = 2;

要注意,使用 mutable_my_map() 函数获取的是可变的 map 对象,因此可以直接使用赋值运算符将键值对插入 map 中。

如果要访问 map 中的元素,可以使用下标运算符,例如:

int value = message.my_map()["key1"];

还有一点要注意,在 .proto 文件中使用的 map 类型实际上是 Google::Protobuf::Map 类型的别名,因此在使用时需要包含 Google::Protobuf 命名空间。