protobuf使用介绍

2016-08-06 22:39:00
admin
原创 7797
摘要:protobuf使用介绍

一、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>

发表评论
评论通过审核之后才会显示。