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 可能包含任意顺序的字节数据
上一篇下一篇

猜你喜欢

热点阅读