protobuf使用介绍
- 2016-08-06 22:39:00
- admin
- 原创 7797
一、protobuf使用介绍
1、protobuf支持多种语言,比如C++、Java、Python;
2、最新版本:https://github.com/protocolbuffers/protobuf
3、历史版本:protobuf-2.6.1.tar.gz
4、帮助文档:https://protobuf.dev
编译protobuf:
1、编译帮助,./configure -h
2、编译安装,./configure && make && make install
3、--with-pic动态链接库一般需要使用此选项;
protoc命令:
1、--cpp_out=OUT_DIR,C++输出
2、--java_out=OUT_DIR,Java输出
3、--python_out=OUT_DIR,Python输出
4、protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/demo.proto
编码细节:
1、Base 128 Varints对整数编码,小整数使用更少字节数;
2、ZigZag编码有符号整数,绝对值小则占用更少字节数;
3、字符串和子对象编码方式是index|type + len + value;
二、原型文件示例
1、option java_package优先于package指令;
2、option java_outer_classname优先于proto文件名;
3、repeated字段的size可以是零,并保持元素插入顺序;
4、repeat数值使用packed可以节约index|type空间;
5、proto2默认不packed,proto3默认packed;
6、optional字段未设置,对象返回默认值,字符串空串,数值零;
7、optional字段可以指定默认值,默认值不参与序列化;
8、枚举默认不允许重复,设置允许重复allow_alias=true;
9、多线程使用大量小型对象时请使用Google tcmalloc;
package tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
三、对象常用方法
1、boolean isInitialized(),检查对象必要成员是否已经设置;
2、Object newBuilder().set().build(),直接设置成员构建对象;
3、Object parseFrom(byte[] data),数据流反序列化为对象;
4、byte[] toByteArray(),对象序列化为数据流;
maven配置:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.6.1</version>
</dependency>