Protocol Buffer 消息定义
概念
protobuf 是 Google 公司提出的一种轻便高效的结构化数据存储格式,常用于结构化数据的序列化,具有语言无关、平台无关、可扩展性特性,常用于通讯协议、服务端数据交换场景
支持的类型
- 数值型
- int32, uint32, sint32, fixed32, sfixed32
- int64, uint64, sint64, fixed64, sfixed64
- float, double
- 默认值:0
- 布尔型
- true
- false
- 字符型
- string, 长度不可超过 232,且需是 UTF-8 编码
- 默认值:空字符串
- 字节型
- bytes 可表示 byte 数组序列,长度不可超过 232
- 默认值:空 byte 数组
- 枚举型
- enum,第一个值必须是 0
- 默认值:0,枚举里定义的第一个枚举值
Tag
在 proto 文件中,tag 比较重要,用来标识字段的唯一性
数值范围:1 - 2^29-1
其中 19000 - 19999 之间的数是保留数,不可用
其中 1 - 15 只占用一个字节,应该用在频繁使用的字段上;16 - 2047 占用两个字节,可以用在不频繁使用的字段上
tag 只能出现 0 或 1 次,这是 proto3 的默认规则
关键词
- syntax 声明 proto 文件的语言版本
- option 定义 proto 或者 生成的代码的相关属性,如设置枚举可定义别名,命名空间
- option allow_alias = true;
- option csharp_namespace = 'xxx';
- package proto 文件里面的 namespace
- import 导入已定义的 proto 类型
- message 定义一个消息
- service 定义一个服务
- repeated 定义数组
- reserved 标记删除的 tag 或 字段名
- reserved 10, 15 to 20, 100 to max;
- reserved 'field1', 'field2';
注释
- // 这行文字被注释了
- /* 这里的文字被注释了 */
示例
message School {
int32 id = 1;
string name = 2;
float size = 3;
bytes image = 4;
// int64 number = 5;
bool is_important = 6;
ClassType classType = 7;
Date build_date = 8;
reserved 5;
reserved 'number';
enum ClassType {
option allow_alias = true;
NOT_SPECIFIED = 0;
LARGE = 1;
SMALL = 2;
BIG = 1;
}
}
message Date {
int32 year = 1;
int32 month = 2;
int32 day = 3;
}