背景
protobuf 是一种跨平台的序列化结构数据的方法,可用于网络数据传输及存储。
本文对 protobuf 的基本使用语法进行整理和总结。
protobuf 中的关键字
①.syntax
用于指定协议版本号,没有指定则默认为 proto2 版本。
②.package
相等于 C++ 中的命名空间,为了防止名称冲突。
③.import
引入其他的 proto 文件,可以使用其他 proto 文件中定义的消息类型。
④.message
用于定义消息类型,相当于 C++ 中的 struct。
⑤.enum
用于定义枚举类型,相当于 C++ 中的 enum。
message 定义
①.概述
message 用于定义一个数据结构类型,是由一系列字段构成。
②.字段定义
每个字段的定义由一定的格式构成:
其中数据类型、字段名称、字段标识是必须定义的部分,字段默认值部分在 proto3 版本中不再支持。
字段修饰符
①.概述
字段修饰符用于指定字段的规则,非必须定义。
②.required
required 表示该字段是必须的,即发送方必须给该字段赋值,接收方也必须能够识别该字段。在 proto3 版本中不再支持该修饰符。
③.optional
optional 表示该字段是可选的,当解析的消息中不存在该值时会被指定为默认值,默认值也可以设置。在 proto3 版本中不再支持该修饰符。
optional int32 ID = 1 [default = 99]
④.singular
singular 表示该字段数量可以是 0 或者 1 个。该限制符不需定义,默认就是 singular 类型。
⑤.repeated
repeated 表示该字段数量可以是 0 或者 多 个。可以用来表示 C++ 中的 vector 类型。
基本数据类型
①.概述
protobuf 中支持的基本数据类型和 C++ 基本一致。
②.数据类型选择
如果数值是正数,根据值的范围大小使用 uint32 \ uint64 类型,但如果数值总是比较大的话选择 fixed32 \ fixed64;
如果数值可能是负数,根据值的范围大小使用 int32 \ int64 类型;但如果数值总是比较大的话选择 sfixed32 \ sfixed64;
float \ double 是固定使用 4 \ 8个字节编码,为提高效率可以把浮点数转为整形进行传输;
string 和 bytes 都是字符串,但 string 仅支持 UTF-8 或者 7-bit ASCII 编码的文本。
字段标识
①.概述
消息类型中的每个字段都必须有一个唯一的数字标识。
②.指定数字标识
字段标识即在字段定义中等号后面的数字。
message DemoMsg
{
string name = 1;
optional int32 id = 2 ;
}