Protobuf入门教程03.01:消息简介
文件
protobuf消息定义位于*.proto
格式文件中。文件名应该使用全小写字母命名,多个字母间使用_
连接,比如hello_world.proto
。
内容
定义内容时应该使用2个空格的缩进。
注释
使用//
和/**/
进行注释。
语法
在文件首行指定当前使用的语法
1 |
|
Protocol Buffers 语言版本3,简称 proto3,是 `*.proto` 文件最新的语法版本。相较于proto2,语法更加简化,使用更加简单
包声明
1 |
|
声明的package在项目中应该具有唯一性,它的作用是避免我们定义的消息发生冲突。它就类似于C++的命名空间,实际上进过编译器编译后就会变成相同名字的命名空间
message
消息(message)就是要定义的结构化对象,我们可以给这个结构化对象中定义其对应的消息字段。message经编译器编译后转变成对应的类(C++)。
1 |
|
字段
消息字段的格式定义为:类型 字段名 = 唯一编号
- 字段名称命名规范:全小写字母,多个字母之间用 _ 连接。
- 字段类型分为:标量数据类型和特殊类型(包括枚举、其他消息类型等)。
- 字段唯一编号:用来标识字段,一旦开始使用就不能够再改变
唯一编号用于唯一的标识每一个字段,在解析和序列化的时候可以准确快速的定位到每个字段的位置和大小。
常用类型对照表
类型 | 说明 | 对应C++类型 |
---|---|---|
double | double | |
float | float | |
int32 | 使用变长编码[1]。负数的编码效率较低⸺若字段可能为负值,应使用sint32代替。 | int32 |
int64 | 使用变长编码[1]。负数的编码效率较低⸺若字段可能为负值,应使用sint64代替。 | int64 |
uint32 | 使用变长编码[1] | uint32 |
uint64 | 使用变长编码[1] | uint64 |
sint32 | 使用变长编码[1]。符号整型。负值的编码效率高于常规的int32类型。 | int32 |
sint64 | 使用变长编码[1]。符号整型。负值的编码效率高于常规的int64类型。 | int64 |
fixed32 | 定长4字节。若值常大于2^28则会比uint32更高效 | uint32 |
fixed64 | 定长8字节。若值常大于2^56则会比uint64更高效 | uint64 |
sfixed32 | 定长4字节。 | int32 |
sfixed64 | 定长8字节。 | int64 |
bool | bool | |
string | 包含UTF-8和ASCII编码的字符串,长度不能超过 2^32 | string |
bytes | 可包含任意的字节序列但长度不能超过2^32 | string |
[1]变长编码是指:经过protobuf编码后,原本4字节或8字节的数可能会被变为其他字节数,可能会变得更长也可能会变得更短。
编号的范围为1 ~ 536,870,911(2^29-1),其中19000~19999不可用。因为Protobuf协议的实现过程中对预留了这些编号
范围为1 ~ 15的字段编号需要一个字节进行编码,16~2047内的数字需要两个字节进行编码。
编码后的字节不仅只包含了编号,还包含了字段类型。所以1~15要用来标记出现非常频繁的字段,要为将来有可能添加的、频繁出现的字段预留一些出来
示例
根据以上说明,我们写一个简单的消息文件。
1 |
|
Protobuf入门教程03.01:消息简介
https://blog.jackeylea.com/protobuf/intro-of-google-protocol-buffers-message/