参考官网: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 命名空间。
...