介绍
protobuf(protocol buffer)是google 的一种数据交换的格式,它独立于平台语言。 google 提供了protobuf多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。 由于它是一种二进制的格式,比使用 xml(20倍) 、json(10倍)进行数据交换快许多。可以把它用 于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
使用
定义protobuf配置文件
test.proto//配置文件
syntax ="proto3";//声明protobuf版本
package rpcProto;//声明了代码所在的命名空间
//定义登录请求消息类型
message loginRequest
{
string name=1;//表示loginRequest消息的第一个字段
string passwd=2;//表示loginRequest消息的第二个字段
}
message loginResponse
{
int32 errcode=1;
string errmsg=2;
bool success=3;
}
对于消息类型中数据类型为string的字段,为了提高效率,可以将string类型替换为bytes类型,并且并不影响后期在代码中的使用,如下所示
syntax="proto3";//声明protobuf版本
package rpcProto;//声明了代码所在的命名空间
//定义登录请求消息类型
message loginRequest
{
bytes name=1;//表示loginRequest消息的第一个字段
bytes passwd=2;//表示loginRequest消息的第二个字段
}
message loginResponse
{
int32 errcode=1;
bytes errmsg=2;
bool success=3;
}
根据配置好文件生成对应的类文件
在终端输入以下命令
protoc test.proto --cpp_out=./
该命令表示通过test.protobuf配置文件生成c++代码文件,输出目录为当前目录./
如图所示,protobuf为我们生成了两个文件test.pb.cc和test.pb.h
在这两个文件里,有两个类分别是loginRequest和loginResponse,也就是我们在配置文件里定义的两个消息类型,并且为这两个类声明了对应的方法
换句话说,protobuf会为我们在配置文件中定义的消息类型生成对应的类
测试
接下来,我们在main.cc文件里测试protobuf
#include<iostream>
#include<string>
#include<test.pb.h>
using namespace std;
using namespace rpcProto;
int main()
{
//定义登录请求消息对象
loginRequest req;
//封装消息
req.set_name("张三");
req.set_passwd("123456");
//消息的序列化
cout<<"消息的序列化:"<<endl;
string send_str;
if(req.SerializeToString(&send_str))
{
cout<<send_str<<endl;
}
//从send_str中反序列化一个login请求对象
loginRequest reqb;
cout<<"消息的反序列化:"<<endl;
if(reqb.ParseFromString(send_str))
{
cout<<reqb.name()<<endl;
cout<<reqb.passwd()<<endl;
}
}
在终端输入以下命令
g++ main.cc test.pb.cc -lprotobuf -I.
其中-I选项表示指定包含头文件test.pb.h的目录