Google protobuf使用向导

本向导讲解了如下内容:

1、在一个.proto文件中定义一个信息格式..

2、使用protocl命令进行编译,生成java代码.

3、使用Java protocol buffer API进行读写操作.

 

以一个地址本为例,从建立一个.proto文件开始,为你想序列化的数据接口加入一个message属性,在message里面,为每一个字段指定名称和类型,下面是一个例子:

package tutorial;

option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

message Person {
  required string name = 1;
  required int32 id = 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;
}

 正如你看到的,语法类似于c++和Java,下面我们来看看每个部分的意义:

 

 为了避免命名冲突,.proto文件以包声明开始,在java中,除了特别指定一个java_package属性,否则包名一般为Java的包.正像上面的例子.虽然提供了java_package属性,你通常还是应该定义package属性以避免在Protocol Buffers中命名冲突.包声明以后,有两个Java属性:java_package和java_outer_classname.java_package表示生成的Java代码的包,如果没有指定,编译器会根据package属性确定包名..


java_outer_classname属性定义文件中包含的类名.如果没有指定,会根据文件名进行转换,例如:"my_proto.proto"缺省会使用MyProto作为外部类名.

 

下一步,需要定义message属性,一个message是包含了各种类型字段的聚集.有很多标准的变量类型可以使用,包括:bool,int32,float,double和string.你也可以使用其

他的message属性作为字段类型,正像例子中的Person包含了PhoneNumber,而AddressBook包含了Persion,你甚至可以在message内部定义message,例如:PhoneNumber就是在Persion里面定义的.你还可以定义enum类型,正像指定电话号码类型的MOBILE,HOME,WORK..

 

The " = 1", " = 2" markers on each element identify the unique "tag" that field uses in the binary encoding. Tag numbers 1-15 require one less

byte to encode than higher numbers, so as an optimization you can decide to use those tags for the commonly used or repeated elements, leaving

tags 16 and higher for less-commonly used optional elements. Each element in a repeated field requires re-encoding the tag number, so repeated

fields are particularly good candidates for this optimization.
里面的"=1","=2"的唯一标记用于二进制编码,1-15
(上面一段应该是效率的体现,设置编码的,需要在研究一下.)

 

每个字段必须提供一个修饰词:
1、required: 表示字段必须提供,不能为空.否则,message会被认为是未初始化的,识图build为初始化的message会抛出RuntimeException,解析未初始化的message会抛出IOException..除此之外,一个required字段与optional字段完全相同.


2、optional:可选字段,可以设置也可以不设置.如果没有设置,会设置一个缺省值.你可以指定一个缺省值,正像电话号码的type字段,否则,使用系统的缺省值:数字类型缺省为0,字符类型缺省为空串,逻辑类型缺省为false.对于嵌入的message,缺省值通常是message的实例或原型.


3、repeated:字段可以被重复(包括0),可以同于动态大小的数组.

 

编译Protocol Buffers文件
protoc -I=$SRC_DIR --java_out=$DST_DIR addressbook.proto
$DST_DIR:生成的java代码的文件夹
编译成功后,会在指定的目录下生成Java代码文件,包含了对属性的操作,下一步就可以通过API进行数据的读写了...

 

下面的内容还没有看完,下回继续..

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值