本文共 2457 字,大约阅读时间需要 8 分钟。
我们今天来快速上手Protobuf的用法,我们会用一个简单的通讯录来进行讲解。
如果还没有装好protobuf的小伙伴可以点击这里:
如果大家使用Linux的话,并且对版本没有太多要求的,可以直接用Linux的软件包来安装,Centos和Ubuntu都可以,我这里以Centos为例:
sudo apt-get install protobuf-compiler
Ubuntu就换成:
sudo apt-get install protobuf
装好protobuf之后,我们用vscode连接,大家可以下载一个支持protobuf语法的插件,我下的是这一个:
然后创建一个后缀为.proto的文件:
创建 .proto 文件时,文件命名应该使用全小写字母命名,多个字母之间用 _ 连接。例如:
向文件添加注释,可使使用 // 或者 /* ... */ :
Protocol Buffers 语言版本3,简称 proto3,是 .proto 文件的最新语法版本。Proto3 简化了 Protocol Buffers 语言,既易于使用,又能在更多编程语言中运用自如。它支持使用 Java、C++、Python 等多种语言生成 Protocol Buffer 代码。
在 .proto 文件里,需使用 syntax = "proto3"; 来指定文件遵循 proto3 语法,这条声明必须位于除去注释内容的首行。如果未作指定,编译器将默认采用 proto2 语法。
在 Protocol Buffers(protobuf)的 .proto 文件中, package 是一个可选但强烈推荐的声明语句。它扮演着命名空间的角色,用于组织和分隔不同的消息类型定义,确保即便在导入多个 .proto 文件到同一个项目时,消息类型之间也不会发生名称冲突。
在分布式系统和网络通信中,消息( message )扮演着至关重要的角色,它是定义数据交换格式的基础。
字段定义遵循以下基本格式:
字段类型 字段名 = 字段唯一编号;
字段名应全部使用小写字母,以保持一致性并符合protobuf的命名约定。
字段类型分为标量数据类型和特殊类型两大类:
每个字段都应分配一个唯一的整数编号,用于在序列化和反序列化过程中识别字段。
下面是一个简单的 Person 消息定义示例:
syntax = "proto3";message Person { int32 id = 1; string first_name = 2; string last_name = 3; int32 age = 4; bool is_student = 5;} 编译命令:
protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR path/to/file.proto
编译 contacts.proto 文件后,会生成所选择语言的代码,我们选择的是C++,所以编译后生成了两个文件:
contacts.pb.h contacts.pb.cc
创建一个测试文件 main.cc,方法中我们实现:
#include#include "contacts.pb.h"using namespace std;int main() { string people_str; { contacts::PeopleInfo people; people.set_age(20); people.set_name("张珊"); if (!people.SerializeToString(&people_str)) { cout << "序列化联系人失败." << endl; } cout << "序列化后的 people_str: " << people_str << endl; } { contacts::PeopleInfo people; if (!people.ParseFromString(people_str)) { cout << "反序列化出联系人失败." << endl; } cout << "Parse age: " << people.age() << endl; cout << "Parse name: " << people.name() << endl; }}
g++ main.cc contacts.pb.cc -o TestProtoBuf -std=c++11 -lprotobuf
运行 TestProtoBuf,可以看见 people 经过序列化和反序列化后的结果:
序列化后的 people_str: [二进制序列]反序列化出联系人失败.
创建 .proto 文件,通过 protoc 工具将 .proto 文件转换为编程语言绑定代码,整合生成的接口到项目中,实现数据操作和消息的编解码。
转载地址:http://qrxfk.baihongyu.com/