一.定义:
Protobuf:全称Google Protocol Buffer(简称protobuf)是一种轻便高效的结构化数据存储方式,与平台无关、语言无关、可扩展,可用于通讯协议和数据存储等领域。
二.具体使用
1.编写.proto文件
1.1定义package
相当于定义c++中的namespace
1.2定义message
相当于定义c++中的class
1.3定义属性
属性定义:标注+类型+属性名+属性顺序号+[默认值]
1.3.1标注
分为三种
1)required:必选属性,message对象必须限时赋值
2)optional:可选属性,如果不指定,则使用该类型的默认值。
3)repeated:重复字段,类似于vector
2.常用API
针对不同的标注,protoc为不同属性提供了不同的方法
1)required和option
A.针对普通数据类型(number等)
1⃣️:获取:TypeName xxx() const;
2⃣️:设值:void set_xxx(const TypeName&);
3⃣️:判断是否设值:bool has_xxx();
4⃣️:清除(使其变为默认值):void clear_xxx();
B.针对string类型,额外提供:
5⃣️:多种set_方法:
void set_xxx(const char* );
6⃣️:提供mutable_方法,返回属性值的可修改指针
std::string* mutable_xxx();
备注:针对非基本数据类型,比如:类类型
包括:1)PB本身支持的类类型(string);2)自定义的类类型:类的嵌套。都提供类似的修改方法:
TypeName* mutable_xxx();
2)repeated
1⃣️:增加:TypeName* add_xxx();
2⃣️:获取size:int xxx_size();
3⃣️:清除:void clear_xxx();
4⃣️:获取某一个:TypeName xxx(int index) const;
5⃣️:获取某一个可修改指针:TypeName* mutable_xxx(int);
6⃣️:获取全部:RepeatedPtrField<TypeName> xxx() const;
7⃣️:获取全部的可修改指针:RepeatedPtrField<TypeName>* mutable_xxx();
3.序列化和反序列化API
1⃣️:序列化到输出流中:
bool SerializeToOstream(std::ostream* output) const
反序列化:从输入流中解析
bool ParseFromIstream(std::istream* input);
2⃣️:序列化到string中:
bool SerializeToString(string* output) const;
反序列化:从string中解析
bool ParseFromString(const string& data);
3⃣️:序列化到字节流中:(最高效,最常用)
bool SerializeToArray(void* data, int size) const;
反序列化:从字节流解析
备注:序列化和反序列化不一定非要配对。不配对也可以解析。
4.message类公共的API
生成的class继承自::google::protobuf::Message类,该基类提供了一些API:
1⃣️:检查required变量是否都已经初始化:
bool IsInitialized() const;
2⃣️:清除所有成员
void clear();
3⃣️copy:使用新的值覆盖当前值
void CopyFrom(const TypeName& from)
网友评论