「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」
什么是PB
PB 是一种与语言无关,平台无关的一种通信协议,类似于XML和JSON。但是他又不同于XML、JSON等结构化文本数据格式,PB 是一种二进制的数据格式,因此具有更高的传输、打包和解包效率。
PB 与 XML 和 JSON 的区别
PB的优势
与XML相比:
- 更简单
- 小3-10倍
- 快20-100倍
- 更少的歧义
- 可以方便的生成数据存取类
PB的语法
PB都是保存为*.proto的文件中的
示例文件:
// 包声明,防止不同message类型的名字冲突
package web;
message User{
required int32 id = 1;
optional string name = 2;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber{
required string number;
optional PhoneType type = 2 [ default = HOME ];
}
}
数据类型
标准类型
| .proto | C++ | 介绍 |
|---|---|---|
| double | double | |
| float | float | |
| int32 | int32 | 变长编码,对负数效率不高 |
| int64 | int64 | |
| uint32 | uint32 | |
| uint64 | uint64 | |
| sint32 | int32 | 变长编码,对负数效率较高 |
| sint64 | int64 | |
| fixed32 | uint32 | 固定4byte,如果数值经常大于2^28的话,效率高于uint32 |
| fixed64 | uint64 | 固定8byte,如果数值经常大于2^56的话,效率高于uint64 |
| sfixed32 | int32 | |
| sfixed64 | int64 | |
| bool | bool | |
| string | string | UTF-8编码或者7-ASCII编码 |
| bytes | string | 任意二进制数据 |
复合类型
enum——枚举类型
- 枚举值必须大于等于0的整数
- 枚举内部的编号不允许重复
- 使用分号(;)分隔枚举变量,而不是C++语言中的逗号(,)
- 第一个编号必须为0(proto3 中)
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message类型
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [ default = HOME ];
}
message 类型可以作为数据类型,即一个message 可以包含另一个message 作为字段
支持message 内嵌套 message
字段
字段格式:限定修饰符 数据类型 字段名称 = 字段编号 [字段默认值]
限定修饰符
- required 表示一个必须字段
- optional 表示一个可选字段
- repeated 表示该字段可以包含0~N个元素
字段名称
建议使用下划线进行分割而不是驼峰,如my_name,而不是myName
字段编号
- 字段必须有编号,有了编号,通信双方才能互相识别对方的字段
- 编号不允许重复
- 编号无需连续
- 编号的取值范围为 1
2^32(4294967296)。其中 115的编码时间和空间效率都是最高的,编号越大,其编码的时间和空间效率就越低(相对于1-15)
- 1900~2000编码值为内部保留值,建议不要在项目中使用
- 建议把要经常传递的值的字段编号设置为1-15之间的值
默认值
- 使用 default 选项为某一字段指定默认值
- proto3中移除了 default 选项。
若有收获,就点个赞吧