序列化与反序列化主要用于解决在跨平台和跨语言的情况下模块之间交互和调用
1.优缺点:
protobuf:
优:序列化之后的数据为二进制字符串,防止信息泄露,序列化完的字符串包较小,序列化效率高只需要使用protobuf对结构数据进行一次描述,即可从各种数据流中读取结构数据,更新数据结构时不会破坏原有的程序。
缺:自解释性较差,数据存储格式为二进制,需要通过 .proto 文件才能了解到内部的数据结构;
不适合用来对 基于文本的标记文档(如HTML) 建模。
json:
缺:压缩完数据较大、压缩效率低
2.proto的使用流程:
syntax="proto3"->设置protobuf的版本
提供的序列化和反序列化的API接口函数
class MessageLite {
public:
//序列化:
bool SerializeToOstream(ostream* output) const;
bool SerializeToArray(void *data, int size) const;
bool SerializeToString(string* output) const;
//反序列化:
bool ParseFromIstream(istream* input);
bool ParseFromArray(const void* data, int size);
bool ParseFromString(const string& data);
};
步骤:
- 书写.proto文件,定义需要结构化处理的数据。
-
syntax="proto3" message 关键字{ 数据类型 变量名=变量的编号; }
- 应用protoc命令编译成目标语言 protoc -I=文件地址 --cpp_out(输出的语言格式定义)=新地址/文件名
- 命令生成两个文件,.h文件和.cc文件(一个类)
- 将这两个文件包含在新创建的项目中。
- 类中存在读API和写API。
- 事例:
int main(){ p.set_id(1001); p.ste_name("lufei"); p.set_sex("一男的"); string output; p.SerializeToString(&output); cout<<""<<output<<endl; person pp; pp.ParseFromString(output); cout<<pp.id()<<pp.name()<<pp.sex(); return 0; }