protoc buffer (java)详解及应用

来源:互联网 发布:御泥坊淘宝旗舰店真假 编辑:程序博客网 时间:2024/05/16 09:47

一、为什么使用protoc buffer?
protoc buffer的作用是序列化数据和结构化数据,但对于这两点我们经常使用的有:java提供的序列化接口和xml。首先说下这两个的缺点,java序列化接口有很多已知的问题,而且在跨平台的问题上做的不是很好,比如c++或着python。xml结构化数据对文本解释的很好,但是结构体比较臃肿,小数据是没有问题的,但针对一些比较大和负责的数据传输效率就有点低下了。
protoc buffer的优点在于跨平台、体积小、传输高效。而且是google的开源代码,稳定性比较高。现在已经支持的平台有java、c++、python、go、c#,我们只需写一份消息体就能同时生成这几种平台所需要的文件。

二、protoc buffer 使用步骤
(1)protoc buffer的官方地址:https://developers.google.com/protocol-buffers/
protoc buffer 源码的下载地址为:https://github.com/google/protobuf/releases
我现在以protoc buffer 2 2.6.1版本为例介绍,现在最新的是protocol buffers v3.0.0.-beta-2。
(2)首先生成编译器,可以自己生成也可以直接down一个编译器。我是自己生成的,因为我直接下载的编译器在后面的使用过程中有问题。我使用的工具是visual studio,打开从github上下载的文件夹,打开vsprojects文件夹,双击protobuf.sln文件,这时会打开这个c++的工程。在visual studio中选在重新生成解决方法,然后在Debug文件夹下拷贝出protoc.exe到另外单独的地方,这个可执行文件就是编译器。然后配置下环境变量,打开cmd,输入命令protoc –version,是否能够打印出版本信息。
(3)生成jar包,
进入源码中的java文件夹,第一步先看readme了,通过maven打jar包,如果没有装maven的话,根据提示一步步的装就好了,首先下载maven,下载地址http://maven.apache.org/。下载完后将bin文件夹路径添加到环境变量。然后用cmd命令行,mvn -v看下是否安装成功了。
将protoc.exe拷贝到java/src目录下。然后打开cmd,cd到java目录,运行命令mvn package就可以了。在target目录下会生成jar包。把这个jar包拷贝到我们android studio工程中备用。
这里的准备工作基本就完成了,兴奋啊!
(4)编写protoc文件
终于步入正题了,例如:新建一个文件person.proto。
message Person{
required string name = 1;
required int32 age = 2;
}
使用命令行
protoc -I=SRCDIRjavaout=DST_DIR SRCDIR/addressbook.protoSRC_DIR替换成person.proto所在的文件夹地址,$DST_DIR替换成即将生成的文件所放的位置。
然后就ok了,生成了我们需要的java文件。
(5)protoc文件
就以官方文档中的例子进行参数介绍吧。

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;}

参数介绍:package:对应java中的包名。java_package对应java中的包名,会覆盖掉package中的值。java_outer_classname生成的java文件的名称。message是一个消息体,消息体中有三种参数要介绍一下:required optional repeated。required说明这个字段是必须的,optional说明是可有可无的,repeated说明这个字段是个list列表,但是考虑到向后的兼容性,optional和repeated后的字段是可以互相兼容的,如果这个版本有这个字段,到后面的版本没有了,也是ok的。还有很多参数,比如import,以后再补吧!
一个message消息体其实可以理解为对应java中的bean。所以上面的那个消息体的意思就是List,AddressBook的结构是string name, int id, string email, List phone。这样就跟java文件中对应起来了。

(6)生成pb文件
用上边的例子说吧,AddressBookProtos.Person.Builder person = AddressBookProtos.Person.newBuilder();
person.setName(“zhang san”);
person.setId(1);
person.setEmail(“….@163.com”);
person.addPhone(Phone);//因为phone字段是一个list,所以要实例化 PhoneNumber对象,然后添加到list中就可以了
这样就实例化了一个Person对象并赋了值。
AddressBookProtos.Builder address = AddressBookProtos.newBuilder();
address.add(person);
这样就将数据全部填进去了。当然person可以多实例化几个,毕竟AddressBookProtos是个list嘛!
address.build().writeTo(output stream);
好了,到这里就差不多了,然后再多看看protoc的其他参数用法,以后再补吧!

0 0