文章目录
前言
我们接下来去编写通讯录 1.0要实现的内容是:
- 对一个联系人的信息使用 PB 进行序列化,并将结果打印出来。
- 对序列化后的内容使用 PB 进行反序列,解析出联系人信息并打印出来。
- 联系人包含以下信息:姓名、年龄。
主要是为了了解使用 ProtoBuf 初步要掌握的内容,以及体验到 ProtoBuf 的完整使用流程。
步骤1:创建 .proto 文件
文件规范
- 创建 .proto 文件时,文件命名应该使用全小写字母命名,多个字母之间用 _ 连接。 例如:
lower_snake_case.proto。 - 书写 .proto 文件代码时,应使用 2 个空格的缩进。
我们为通讯录 1.0 新建文件:contacts.proto
添加注释
向文件添加注释,可使用 // 或者 /* … */
指定 proto3 语法
Protocol Buffers 语言版本3,简称 proto3,是 .proto 文件最新的语法版本。proto3 简化了 Protocol Buffers 语言,既易于使用,又可以在更广泛的编程语言中使用。它允许你使用 Java,C++,Python 等多种语言生成 protocol buffer 代码。
在 .proto 文件中,要使用 syntax = "proto3"; 来指定文件语法为 proto3,并且必须写在除去注释内容的第一行。 如果没有指定,编译器会使用proto2语法。
在通讯录 1.0 的 contacts.proto 文件中,可以为文件指定 proto3 语法,内容如下:
syntax = "proto3";
package 声明符
package 是一个可选的声明符,能表示.proto 文件的命名空间,在项目中要有唯一性。它的作用是为了避免我们定义的消息出现冲突。
在通讯录 1.0 的 contacts.proto 文件中,可以声明其命名空间,内容如下:
syntax = "proto3";
package contacts;
定义消息(message)
消息(message): 要定义的结构化对象,我们可以给这个结构化对象中定义其对应的属性内容。
这里再提一下为什么要定义消息?
在网络传输中,我们需要为传输双方定制协议。定制协议说白了就是定义结构体或者结构化数据,比如,tcp,udp 报文就是结构化的。 再比如将数据持久化存储到数据库时,会将一系列元数据统一用对象组织起来,再进行存储。
所以 ProtoBuf 就是以 message 的方式来支持我们定制协议字段,后期帮助我们形成类和方法来使用。在通讯录 1.0 中我们就需要为联系人定义一个 message。
.proto 文件中定义一个消息类型的格式为:
message 消息类型名{
}
消息类型命名规范:使⽤驼峰命名法,首字母大写。
为 contacts.proto(通讯录 1.0)新增联系人message,内容如下:
syntax = "proto3";
package contacts;
// 定义联系人消息
message PeopleInfo {
}
定义消息字段
在 message 中我们可以定义其属性字段,字段定义格式为:字段类型 字段名 = 字段唯一编号;
- 字段名称命名规范:全小写字母,多个字母之间用 _ 连接。
- 字段类型分为:标量数据类型 和 特殊类型(包括枚举、其他消息类型等)。
- 字段唯一编号:用来标识字段,一旦开始使用就不能够再改变。
该表格展示了定义于消息体中的标量数据类型,以及编译 .proto 文件之后自动生成的类中与之对应的字段类型。在这里展示了与 C++ 语言对应的类型。
| .proto Type | Notes | C++ Type |
|---|---|---|
| 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 更高效。 |



被折叠的 条评论
为什么被折叠?



