博客
关于我
protobuf —— 快速上手
阅读量:796 次
发布时间:2023-03-04

本文共 2457 字,大约阅读时间需要 8 分钟。

Protobuf —— 快速上手

我们今天来快速上手Protobuf的用法,我们会用一个简单的通讯录来进行讲解。

如果还没有装好protobuf的小伙伴可以点击这里:

点击这里下载 protobuf

安装 protobuf

如果大家使用Linux的话,并且对版本没有太多要求的,可以直接用Linux的软件包来安装,Centos和Ubuntu都可以,我这里以Centos为例:

sudo apt-get install protobuf-compiler

Ubuntu就换成:

sudo apt-get install protobuf

创建 .proto 文件

装好protobuf之后,我们用vscode连接,大家可以下载一个支持protobuf语法的插件,我下的是这一个:

下载插件

然后创建一个后缀为.proto的文件:

创建 .proto 文件

创建 .proto 文件时,文件命名应该使用全小写字母命名,多个字母之间用 _ 连接。例如:

下划线命名规范

添加注释

向文件添加注释,可使使用 // 或者 /* ... */ :

添加注释

指定 proto3 语法

Protocol Buffers 语言版本3,简称 proto3,是 .proto 文件的最新语法版本。Proto3 简化了 Protocol Buffers 语言,既易于使用,又能在更多编程语言中运用自如。它支持使用 Java、C++、Python 等多种语言生成 Protocol Buffer 代码。

在 .proto 文件里,需使用 syntax = "proto3"; 来指定文件遵循 proto3 语法,这条声明必须位于除去注释内容的首行。如果未作指定,编译器将默认采用 proto2 语法。

proto3 语法

package 声明符

在 Protocol Buffers(protobuf)的 .proto 文件中, package 是一个可选但强烈推荐的声明语句。它扮演着命名空间的角色,用于组织和分隔不同的消息类型定义,确保即便在导入多个 .proto 文件到同一个项目时,消息类型之间也不会发生名称冲突。

package 声明符

定义消息(message)

在分布式系统和网络通信中,消息( message )扮演着至关重要的角色,它是定义数据交换格式的基础。

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;}

编译 contacts.proto 文件,生成 C++ 文件

编译命令:

protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR path/to/file.proto

编译命令

编译 contacts.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; }}

编译 main.cc

g++ main.cc contacts.pb.cc -o TestProtoBuf -std=c++11 -lprotobuf

执行测试程序

运行 TestProtoBuf,可以看见 people 经过序列化和反序列化后的结果:

序列化后的 people_str: [二进制序列]反序列化出联系人失败.

总结

创建 .proto 文件,通过 protoc 工具将 .proto 文件转换为编程语言绑定代码,整合生成的接口到项目中,实现数据操作和消息的编解码。

转载地址:http://qrxfk.baihongyu.com/

你可能感兴趣的文章
poj1753——Flip Game
查看>>
poj1936 假期计划第一水
查看>>
poj1958-汉诺四塔问题(三种方法)
查看>>
poj1988(并查集)
查看>>
POJ2007+几何+极角排序
查看>>
poj2039
查看>>
poj2135(简单的最小费用流问题)
查看>>
POJ2251
查看>>
QT界面操作1:如何跟踪鼠标位置?
查看>>
QT点击"X"按钮,调用closeEvent()函数来实现调用特定事件(附:粗略介绍QT的信号与槽的使用方法)...
查看>>
Pomelo开发中Web客户端开发API简介
查看>>
PON架构(全光网络)
查看>>
PoolingHttpClientConnectionManager原理剖析
查看>>
POP-一个点击带有放大还原的动画效果
查看>>
POP3 协议在计算机网络中的优缺点
查看>>
Portaudio笔记-WASAPI
查看>>
position:fixed失效情况
查看>>
Position属性四个值:static、fixed、absolute和relative的区别和用法
查看>>
POSIX thread编程中关于临界区内条件变量的分析
查看>>
POSIX与程序可移植性
查看>>