Protobuf产生于Google,是一种序列化和反序列化协议,具有空间开销小、解析速度快、兼容性好等优点,非常适合于对性能要求高的RPC(Remote Procedure Call)调用。
1、前期准备
(1)下载protobuf源码
https://github.com/protocolbuffers/protobuf/releases
(2)下载CMake
2、编译protobuf
(1)配置CMake
cmake-3.17.1-win64-x64.msi进行默认安装完成,然后运行cmake-gui.exe。
在"1"处选择protobuf源码解压目录,后缀为cmake;
弹出生成器选择窗口,我们选择"Visual Studio 15 2017"与"x64",然后点击"Finish"。
Configure完成后下方提示:"Configuring done"。
然后,我们选择"Generate",为protobuf源码生成VS工程文件。
注意:勾选"protobuf_BUILD_SHARED_LIBS",表示生成动态库;
Generate完成后下方提示:"Generating done"。
(2)编译protobuf
在VS中编译libprotobuf,protoc这2个项目。
生成libprotobufd.lib、libprotocd.lib、protoc.exe。
注意:若需要在Qt+MSVC开发方式下,调用protobuf的lib,那么需要修改libprotobuf工程属性,然后再编译生成lib。
“配置属性”->“C/C++”->“代码生成”->运行库,Debug版选择“/MDd”,Release版选择“/MD”,“应用”->"确定"。
参考《QT MSVC版本使用protobuf库》:https://blog.csdn.net/f1jiaziqing2/article/details/86474311
3、protobuf的简单使用
我们需要编写*.proto文件,该文件描述了某结构T中的各数据字段,然后使用protoc.exe编译*.proto,生成*.cc和*.h文件,也可以生成其他的语言。
我们将*.cc和*.h加入工程中参与编译,就可以调用这俩文件中方法实现T的序列化和反序列化。
有了这种代码生成机制,开发人员再也不用吭哧吭哧地编写那些协议解析的代码了。
《Protocol Buffers介绍》:https://blog.csdn.net/program_think/article/details/4229773
假设开发一个CS架构的程序,客户端使用C++,服务器使用Java,那么我们可以共享一套网络传输协议中涉及到需要串行化的对象proto文件,使用protoc.exe分别将这套proto文件编译成C++、Java语言版,那么在服务器和客户端就可以实现对同一串数据实现反序列化,这种功能正得益于protobuf的跨语言、跨平台性。
(1)拷贝protobuf头文件、libprotobufd.lib以及protoc.exe
使用Qt建立一个控制台工程(略),然后将protobuf头文件、libprotobufd.lib以及protoc.exe拷贝至工程目录下,
头文件都在protobuf-3.11.4\src\google目录下,我们拷贝google目录。
(2)新建、编译proto文件
在工程目录下,新建一个Account.proto的文本文件,内容如下:
syntax = "proto3";
package IM;
message Account {
//账号
uint64 ID = 1;
//名字
string name = 2;
//密码
string password = 3;
}
message User {
Account user = 1;
}
protoc --cpp_out=./ Account.proto
打开Account.pb.h头文件,发现package表示命名空间,message表示类名,大概如下结构:
namespace IM {
class Account {
// 若干自动生成的代码
};
class User {
// 若干自动生成的代码
}
};
(3)Qt工程配置
.pro文件中添加Account.pb.h、Account.pb.cc,添加链接libprotobufd.lib库。
(4)编写测试代码
#include <QCoreApplication>
#include <iostream>
#include <fstream>
#include "Account.pb.h"
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
IM::Account account1;
account1.set_id(1);
account1.set_name("windsun");
account1.set_password("123456");
string serializeToStr;
account1.SerializeToString(&serializeToStr);
cout << "Serialization:" << endl;
cout << serializeToStr << endl;
IM::Account account2;
if(!account2.ParseFromString(serializeToStr))
{
cerr << "failed to parse student." << endl;
return -1;
}
cout << "Deserialization:" << endl;
cout << account2.id() << endl;
cout << account2.name() << endl;
cout << account2.password() << endl;
google::protobuf::ShutdownProtobufLibrary();
return a.exec();
}
参考链接:https://www.cnblogs.com/WindSun/p/12543066.html
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。
本文涉及工程代码,公众号回复:01AccountTest,即可下载。