Protocol Buffers 是一种结构数据序列化方法,可以将C++中定义的存储类的内容与二进制序列串相互转换,主要用于数据传输或数据存储,可类比XML、JSON,而XML、JSON基于文本格式,protobuf是二进制格式,所以比XML、JSON更小(3~10倍)、更快(20 ~ 100倍),但是使用也相对复杂。
搭建Protobuf c++ vs工程
1 获取 protobuf库
win下需自行编译,下载后编译。
Releases · protocolbuffers/protobuf · GitHub
2 配置测试工程
上述编译成功后生成库目录,将依赖头文件、lib文件、dll文件配置到测试工程中
工程配置如下:
常规\输出目录 ..\..\build\$(PlatformToolset)\$(Platform)\$(Configuration)\
C/C++\常规\附加包含目录 ..\..\build\include
链接器\常规\附加库目录 ..\..\build\$(PlatformToolset)\$(Platform)\lib
3 编写msgtest.proto文件
syntax="proto3"; //protobuf协议版本
package test; //包名
message helloworld
{
int32 id = 1; // 必选类型
string str = 2; // str
int32 opt = 3; //可选
}
4 生成引用文件
执行上述编译好的protoc.exe,生成h与cpp文件
protoc.exe --cpp_out=. msgtest.proto
5 应用
将生成的msgtest.pb.h与msgtest.pb.cc放入测试工程目录下,并添加到工程,写测试。
#include <iostream>
#include <fstream>
#include "msgtest.pb.h"
#pragma comment(lib,"libprotobuf.lib")
#pragma comment(lib,"libprotoc.lib")
void test_write()
{
test::helloworld msg1;
msg1.set_id(101);
msg1.set_str("hello101");
std::fstream output("./log", std::ios::out | std::ios::trunc | std::ios::binary);
if (!msg1.SerializeToOstream(&output))
{
std::cerr << "Failed to write msg." << std::endl; return;
}
}
void test_read()
{
test::helloworld msg2;
{
std::fstream input("./log", std::ios::in | std::ios::binary);
if (!msg2.ParseFromIstream(&input)) {
std::cerr << "Failed to parse address book." << std::endl;
return;
}
}
std::cout << "id:"<< msg2.id() << std::endl;
std::cout << "str:" << msg2.str() << std::endl;
}
int main()
{
std::cout << "hello protobuf" << std::endl;
test_write();
test_read();
getchar();
return 0;
}
6 编译运行
编译错误:无法解析的外部符号 "class google::protobuf::internal::ExplicitlyConstructed<class std::basic_string<char,struct std::char_traits,class std::allocator > >
解决:在生成的msgtest.pb.h头文件中添加 #define PROTOBUF_USE_DLLS