vs2019 c++中使用goole protobuf
VS c++中使用protobuf
在自己创建的项目下(这里项目名为ProtoBufTest),新建一个Account.proto,内容如下
syntax = "proto3";
package IM;
message Account {
//账号
uint64 ID = 1;
//名字
string name = 2;
//密码
string password = 3;
}
message User {
Account user = 1;
}
proto中支持的标量类型
double
float
int32
int64
//无符号整数
uint32
uint64
//有符号,可用来加密有负数的整数
sint32
sint64
//固定整型,字节数固定,如果整数的取值范围占用字节数固定在4个或者八个字节,可以使用如下的类型
fixed32 //4字节
fixed64 //8字节
sfixed32 //4字节
sfixed64 //8字节
//bool
bool
//string,必须为UTF-8或者ASCII码
string
//bytes,可以包含任意的bytes序列,长度不超过2^32次方
bytes
具体可以参考https://blog.csdn.net/qq_39378657/article/details/109237465
将编译好的libprotobufd.lib和protoc.exe拷贝到自己创建的项目下
按住shift+右键,选择打开CMD,输入protoc --cpp_out=./ Account.proto

or vs下
发现目录中多了两个文件,一个.h头文件一个.cc源文件
然后将生成的代码手动添加到项目中
vs要设置的关键步骤
1.先将平台设置为所有平台
2.多线程调试(/MTd)
3.关闭安全警告_SCL_SECURE_NO_WARNINGS
4.添加之前拷贝到项目中的库libprotobufd.lib,如果有多个.lib,需要用分号隔开
5.还要将protobuf源码中src/google文件夹拷贝到项目目录下,即从ProtoBuf解压出的那个文件目录

6.然后设置包含你的项目目录
7.将解决方案平台改为x64(重要!),这个根据编译的库来确定平台,如下编译的库为x86,则调整为x86
8. 代码示例
例1:
#include <iostream>
#include <fstream>
#include "Account.pb.h"
using namespace std;
int main(int argc, char** argv)
{
IM::Account account1;
account1.set_id(123);
account1.set_name("xxx");
account1.set_password("123456");
string serializeToStr;
account1.SerializeToString(&serializeToStr);
cout << "C++ String的序列化后的字节1:" << serializeToStr << endl;
uint8_t byteArray[32] = {0};
account1.SerializeToArray(byteArray,sizeof(byteArray));
cout << "C数组的序列化后的字节2:" << byteArray << endl;
IM::Account account2;
if (!account2.ParseFromString(serializeToStr))
{
cerr << "failed to parse string." << endl;
return -1;
}
cout << "C++ String的反序列化1:" << endl;
cout << account2.id() << endl;
cout << account2.name() << endl;
cout << account2.password() << endl;
IM::Account account3;
if (account3.ParseFromArray(byteArray, sizeof(byteArray)))
{
cerr << "failed to parse array." << endl;
return -1;
}
cout << "C数组的反序列化2:" << endl;
cout << account3.id() << endl;
cout << account3.name() << endl;
cout << account3.password() << endl;
IM::Device device1;
device1.set_devicename("Motor");
device1.set_serialnumber(123456);
cout << "C++ String的序列化3:" << endl;
std::string strDevice;
device1.SerializeToString(&strDevice);
cout << "序列化后的字节3:" << strDevice << endl;
cout << "C++ String的反序列化3:" << endl;
device1.ParseFromString(strDevice);
cout << device1.devicename() << endl;
cout << device1.serialnumber() << endl;
google::protobuf::ShutdownProtobufLibrary();
return 0;
}
输出结果如下
例2:
IM::Device device2;
fstream file("testStream.xxx", ios::in | ios::out | ios::trunc | ios::binary);
device2.set_devicename("Led");
device2.set_serialnumber(666666);
cout << "C++ stream序列化:" << endl;
device2.SerializeToOstream(&file);
file.flush();
file.seekg(0, ios::beg);
IM::Device device3;
cout << "C++ stream反序列化:" << endl;
device3.ParseFromIstream(&file);
cout << "name = " << device3.devicename() << endl;
cout << "id = " << device3.serialnumber() << endl;
file.close();
输出结果如下:
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)