syntax = "proto2";
package tutorial;
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
1、首先是要建一个*.proto的文件
2、每个元素后面的" = 1", " = 2"标记是标识字段在二进制编码中使用的唯一“标记”。标签号1-15比更高的数字少一个字节进行编码,因此作为优化,可以将这些标签用于常用或重复的元素,而将16和更高的标签用于不常用的可选元素。重复字段中的每个元素都需要重新编码标记号,因此重复字段尤其适合于此优化。
3、每个字段的注释类型解释
3.1、required: 必须提供字段值,否则消息将被视为“未初始化”。序列化未初始化的消息将引发异常。分析未初始化的消息将失败。除此之外,该字段的行为与optional字段完全相同。
3.2、optional:该字段可以设置,也可以不设置。如果未设置optional字段值,则使用默认值。对于简单类型,可以指定自己的默认值,否则,将使用系统默认值:对于数值类型为零,对于字符串为空字符串,对于布尔值为假。对于嵌入的消息,默认值始终是消息的“默认实例”或“原型”,它没有设置任何字段。调用访问器以获取尚未显式设置的optional(或required)字段的值,始终返回该字段的默认值。
3.3、repeated:字段可以重复任意次数(包括零)。重复值的顺序将保留在协议缓冲区中。将重复字段视为动态大小的数组。
4、写好proto文件后,下一步需要使用protocol buffer的编译器protoc 编译.proto文件,生成class;
protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto