protobuf 学习
2018-09-27 本文已影响0人
Zz鱼丸
syntax="proto2"; 指明编译器版本(最新的版本为v3)
package name; 类似c++中的namespace
import "src/help.proto"; 导入外部proto
message Protobuf中的结构化数据,类似于C++中的class
protobuf一共有三个字段修饰符:
- required:该值是必须要设置的;
- optional :该字段可以有0个或1个值(不超过1个);
- repeated:该字段可以重复任意多次(包括0次),类似于C++中的list;
常用API
protoc为message的每个required字段和optional字段都定义了以下几个函数
1 TypeName xxx() const; //获取字段的值
2 bool has_xxx(); //对于可选成员,判断是否设值
3 void set_xxx(const TypeName&); //设值
4 void clear_xxx(); //使其变为默认值
为每个repeated字段定义了以下几个:
1 TypeName* add_xxx(); //增加结点
2 TypeName xxx(int) const; //获取指定序号的结点,类似于C++的"[]"运算符
3 TypeName* mutable_xxx(int); //类似于上一个,但是获取的是指针
4 int xxx_size(); //获取结点的数量
几个是常用的序列化函数:
1 bool SerializeToOstream(std::ostream * output) const; //输出到输出流中
2 bool SerializeToString(string * output) const; //输出到string
3 bool SerializeToArray(void * data, int size) const; //输出到字节流
与之对应的反序列化函数:
1 bool ParseFromIstream(std::istream * input); //从输入流解析
2 bool ParseFromString(const string & data); //从string解析
3 bool ParseFromArray(const void * data, int size); //从字节流解析
其他常用的函数:
1 bool IsInitialized(); //检查是否所有required字段都被设值
2 size_t ByteSize() const; //获取二进制字节序的大小
proto类型 | C++类型 | 备注 |
---|---|---|
double | double | |
float | float | |
int32 | int32 | 使用可变长编码,编码负数时不够高效——如果字段可能含有负数,请使用sint32 |
int64 | int64 | 使用可变长编码,编码负数时不够高效——如果字段可能含有负数,请使用sint64 |
uint32 | uint32 | 使用可变长编码 |
uint64 | uint64 | 使用可变长编码 |
sint32 | int32 | 使用可变长编码,有符号的整型值,编码时比通常的int32高效 |
sint64 | int64 | 使用可变长编码,有符号的整型值,编码时比通常的int64高效 |
fixed32 | uint32 | 总是4个字节,如果数值总是比总是比228大的话,这个类型会比uint32高效 |
fixed64 | uint64 | 总是8个字节,如果数值总是比总是比256大的话,这个类型会比uint64高效 |
sfixed32 | int32 | 总是4个字节 |
sfixed64 | int64 | 总是8个字节 |
bool | bool | |
string | string | 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本 |
bytes | string | 可能包含任意顺序的字节数据 |