Protobuf入门教程03.01:消息简介

文件

protobuf消息定义位于*.proto格式文件中。文件名应该使用全小写字母命名,多个字母间使用_连接,比如hello_world.proto

内容

定义内容时应该使用2个空格的缩进。

注释

使用///**/进行注释。

语法

在文件首行指定当前使用的语法

1
syntax = "proto3";

Protocol Buffers 语言版本3,简称 proto3,是 `*.proto` 文件最新的语法版本。相较于proto2,语法更加简化,使用更加简单

包声明

1
package abc;//可选

声明的package在项目中应该具有唯一性,它的作用是避免我们定义的消息发生冲突。它就类似于C++的命名空间,实际上进过编译器编译后就会变成相同名字的命名空间

message

消息(message)就是要定义的结构化对象,我们可以给这个结构化对象中定义其对应的消息字段。message经编译器编译后转变成对应的类(C++)。

1
2
3
4
5
// message 格式
message MessageName{

}
// 消息类型命名规范:使用驼峰命名法,首字母大写

字段

消息字段的格式定义为:类型 字段名 = 唯一编号

  • 字段名称命名规范:全小写字母,多个字母之间用 _ 连接。
  • 字段类型分为:标量数据类型和特殊类型(包括枚举、其他消息类型等)。
  • 字段唯一编号:用来标识字段,一旦开始使用就不能够再改变

唯一编号用于唯一的标识每一个字段,在解析和序列化的时候可以准确快速的定位到每个字段的位置和大小。

常用类型对照表

类型说明对应C++类型
doubledouble
floatfloat
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
boolbool
string包含UTF-8和ASCII编码的字符串,长度不能超过 2^32string
bytes可包含任意的字节序列但长度不能超过2^32string

[1]变长编码是指:经过protobuf编码后,原本4字节或8字节的数可能会被变为其他字节数,可能会变得更长也可能会变得更短。

编号的范围为1 ~ 536,870,911(2^29-1),其中19000~19999不可用。因为Protobuf协议的实现过程中对预留了这些编号

范围为1 ~ 15的字段编号需要一个字节进行编码,16~2047内的数字需要两个字节进行编码。

编码后的字节不仅只包含了编号,还包含了字段类型。所以1~15要用来标记出现非常频繁的字段,要为将来有可能添加的、频繁出现的字段预留一些出来

示例

根据以上说明,我们写一个简单的消息文件。

1
2
3
4
5
6
7
8
9
10
11
12
// 指定采用 proto3 语法
syntax="proto3";

// 相当于命名空间
package lm;

message helloworld
{
int32 id = 1; // ID
string str = 2; // str
int32 opt = 3; //optional field
}

Protobuf入门教程03.01:消息简介
https://blog.jackeylea.com/protobuf/intro-of-google-protocol-buffers-message/
作者
JackeyLea
发布于
2024年7月29日
许可协议