一、protobuf简介
protobuf (protocol buffer)是google公司实现的一种数据交换的格式,由于其是一种二进制的格式,相对于xml,json进行数据交换要快很多,且占用存储空间更小。因此可以把它用于分布式应用之间的数据通信的数据交换格式,作为一种效率和兼容性都非常优秀的二进制数据传输格式。
二、protobuf的基础语法及编译命令
由于protobuf独立于平台语言,Google为其提供了多种语言的实现,包括Java,C++,Go,Python等,并且为每一种实现都包含了相应语言的编译器和库文件,方便不同语言开发者的使用。
(1)基础语法
syntax = "proto3";
package testprotobuf;
message Person {
string name = 1; // 字符串类型
int32 age = 2; // int32类型
enum Sex { //枚举类型
MAN = 0;
WOMAN = 1;
}
Sex sex = 3;
bool flag = 4; // bool类型
}
(2)编译
使用protoc讲proto文件,编译生成C++的源文件和头文件,如对test1.proto进行编译:
protoc test1.proto --cpp_out=./
生成test1.pb.cc和test1.pb.h文件
三、使用proto文件生成的类,对对象进行序列化和反序列化
(1)序列化
#include "test1.pb.h"
#include
#include
using namespace std;
using namespace testprotobuf;
int main() {
Person p;
p.set_age(10);
p.set_name("zhangsan");
p.set_sex(testprotobuf::Person::MAN);
p.set_flag(false);
// 序列化
std::string msg;
if (p.SerializeToString(&msg)) {
cout << msg.c_str() << endl;
}
}
g++ main.cc test1.pb.cc -lprotobuf -o main
(2)反序列化
#include "test1.pb.h"
#include
#include
using namespace std;
using namespace testprotobuf;
int main() {
Person p;
p.set_age(10);
p.set_name("zhangsan");
p.set_sex(testprotobuf::Person::MAN);
p.set_flag(false);
// 序列化
std::string msg;
if (p.SerializeToString(&msg)) {
cout << msg.c_str() << endl;
}
// 反序列化
Person p1;
if (p1.ParseFromString(msg)) {
cout << p1.name() << endl;
cout << p1.age() << endl;
cout << p1.sex() << endl;
cout << p1.flag() << endl;
}
return 0;
}