PB学习

2020-10-10  本文已影响0人  celusing

一.定义:

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)

上一篇下一篇

猜你喜欢

热点阅读