protobuf是一种用于序列化结构数据的工具,实现数据的存储与交换,与编程语言和开发平台无关。
序列化:将结构数据或者对象转换成能够用于存储和传输的格式。
反序列化:在其他的计算环境中,将序列化后的数据还原为结构数据和对象。
下面是一个简单的使用示例:
message SearchRequest {
required string query = 1;
optional int32 page_number = 2;
optional int32 result_per_page = 3; [default=10] //设置默认值
}
其中后面的数字编号表示;二进制格式中识别各个字段的,一旦开始使用就不能再改变,[1,15]之内的标识号在编码的时候会占用一个字节,之后的[16,2047]会占用两个字节
注意:在proto3中没有这些选项
repeated int32 samples = 4 [packed=true];
2.1、优点
2.2、缺点
使用proto文件定义好结构数据后,可以使用protoc编译器生成结构数据的源代码,这些源代码提供了读写结构数据的接口,从而能够构造、初始化、读取、序列化、反序列化结构数据。使用以下命令生成相应的接口代码:
// $SRC_DIR: .proto所在的源目录
// --cpp_out: 生成C++代码
// $DST_DIR: 生成代码的目标目录
// xxx.proto: 要针对哪个proto文件生成接口代码
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto
编译完成后将会生成一个xxx.pb.h和xxx.pb.cpp文件,会提供类似SerializeToOstream()、set_name()、name()等方法。
XML、JSON、protobuf都具有数据结构化和数据序列化的能力。
XML、JSON更注重数据结构化,关注可读性和语义表达能力;protobuf 更注重数据序列化,关注效率、空间、速度,可读性较差,语义表达能力不足。
protobuf的应用场景更为明确,XML、JSON的应用场景更为丰富。