protobuf版本
protobuf/3.11.3
Person.proto
syntax = "proto3";
package test;
//枚举定义
enum SexEnum{
MAN=0;
WOMAN=1;
}
//消息
message Person{
string name=1;
optional SexEnum sex=2;
uint32 age=3;
repeated Address myAddress=4;
string brithday=5;
bool status=6;
string picture=7;
repeated bytes image=8;
}
//消息
message Address{
string desc=1;
optional string cityCode=2;
}
将proto结构描述模板生成C++代码
protoc -I=. --cpp_out=. Person.proto
C++的protobuf序列化
Person *p1=new Person;
p1->set_age(121212);
p1->set_sex(MAN);
p1->set_image("asdasd");
p1->set_brithday("2020-01-1");
p1->set_name("zhangsan");
p1->set_status(true);
p1->set_picture("1.png");
Address *ad=p1->add_myaddress();
ad->set_citycode("430321");
ad->set_desc("xiangtanshi");
//读取图片
FILE *readImageFd=fopen("d:\\1.png","rb");
fseek(readImageFd,0,SEEK_END);
int imageSize=ftell(readImageFd);
fseek(readImageFd,0,SEEK_SET);
char *imageBuffer=new char[imageSize];
fread(imageBuffer,1,imageSize,readImageFd);
fclose(readImageFd);
string image_data;
//图片的二进制数据绑定到string对象中
image_data.assign(imageBuffer,imageSize);
p1->set_image(image_data);
delete []imageBuffer;
//将对象序列化成文件
fstream output1("./1.pb",ios::binary|ios::out);
p1->SerializeToOstream(&output1);
delete p1;
output1.close();
C++的protobuf反序列化
//读取文件
fstream inputstream("./1.pb",ios::in|ios::binary);
inputstream.seekg (0, inputstream.end);
int length = inputstream.tellg();
inputstream.seekg (0, inputstream.beg);
char *pdbuffer=new char[length];
inputstream.read(pdbuffer,length);
inputstream.close();
Person *p1=new Person();
//将二进制数据反序列化到person对象中
p1->ParseFromArray(pdbuffer,length);
std::cout << "name=" << p1->name() << std::endl;
std::cout << "age=" << p1->age() << std::endl;
std::cout << "sex=" << p1->sex() << std::endl;
std::cout << "status=" << p1->status() << std::endl;
std::cout << "picture=" << p1->picture() << std::endl;
std::cout << "address=" << "city" << p1->myaddress(0).desc() << "=" << p1->myaddress(0).citycode() << std::endl;
//将person对象中的图片输出成文件
fstream outputStream("./1.png",ios::binary|ios::out);
outputStream.write(p1->image().data(),p1->image().size());
outputStream.close();
注意事项
1.debug开发模式下创建protobuf的对象,并且对字符串属性赋值会报错,原因是引用的protobuf态库和静态库是release版本的导致报错,debug开发模式下引用protobuf的debug版本的态库和静态库。
网友评论