protobuf入门教程(三):常用序列化 反序列化接口_proto的serializewithcachedsizestoarray后如何反序列化

57 阅读3分钟

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

cout << "email = " << obj.email() << endl;

}

int main() { // Verify that the version of the library that we linked against is // compatible with the version of the headers we compiled against. GOOGLE_PROTOBUF_VERIFY_VERSION;

set_person(); //序列化
get_person(); //反序列化

// Optional: Delete all global objects allocated by libprotobuf.
google::protobuf::ShutdownProtobufLibrary();

return 0;

}


![这里写图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/98cd4c7d2379412a8aa3883e4aa9406a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771920569&x-signature=OfcSgW%2FeJ5dw207HYEP1utpBAho%3D)


## C++ String的序列化和反序列化



//bool SerializeToString(string* output) const; //bool ParseFromString(const string& data);

string str; //全局变量

void set_person() { Person obj; obj.set_name("mike"); obj.set_id(1); obj.set_email("xxx@qq.com"); //*obj.mutable_email() = "xxx@qq.com";

obj.SerializeToString(&str);    //序列化,obj成员的内容设置给str

}

void get_person() { Person obj; obj.ParseFromString(str); //反序列化, str内容设置给obj的成员

cout << "name = " << obj.name() << endl;
cout << "id = " << obj.id() << endl;
cout << "email = " << *obj.mutable_email() << endl;

}


## 文件描述符序列化和反序列化



//bool SerializeToFileDescriptor(int file_descriptor) const; //bool ParseFromFileDescriptor(int file_descriptor);

void set_person() { Person obj; obj.set_name("mike"); obj.set_id(1); obj.set_email("xxx@qq.com"); //*obj.mutable_email() = "xxx@qq.com";

//O\_CREAT: 新建文件, O\_TRUNC:清空文件,O\_RDWR:读写
int fd = open("./pb.xxx", O_CREAT | O_TRUNC | O_RDWR, 0644);
if (fd <= 0)
{
    perror("open");
    exit(0);
}

obj.SerializeToFileDescriptor(fd);  //序列化,obj成员的内容写入fd所关联的文件中

close(fd); //关闭文件

}

void get_person() { int fd = open("./pb.xxx", O_RDONLY); //O_RDONLY: 只读方式 if (fd <= 0) { perror("open"); exit(0); }

Person obj;
obj.ParseFromFileDescriptor(fd); //反序列化, fd文件内容设置给obj的成员
close(fd); //关闭文件

cout << "name = " << obj.name() << endl;
cout << "id = " << obj.id() << endl;
cout << "email = " << *obj.mutable_email() << endl;

}


## C++ stream 序列化和反序列化



//bool SerializeToOstream(ostream* output) const; //bool ParseFromIstream(istream* input);

void set_person() { Person obj; obj.set_name("mike"); obj.set_id(1); obj.set_email("xxx@qq.com"); //*obj.mutable_email() = "xxx@qq.com";

fstream output("pb.xxx", ios::out | ios::trunc | ios::binary);

bool flag = obj.SerializeToOstream(&output);//序列化
if (!flag)
{
    cerr << "Failed to write file." << endl;
    return;
}

output.close();//关闭文件

}

void get_person() { Person obj; fstream input("./pb.xxx", ios::in | ios::binary); obj.ParseFromIstream(&input); //反序列化 input.close(); //关闭文件

cout << "name = " << obj.name() << endl;
cout << "id = " << obj.id() << endl;
cout << "email = " << \*obj.mutable_email() << endl;

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取