记录:ProtocolBuffers(protobuf)在Java开发中使用

数据交换的方式很多比如:XML,JSON,Protobuf。虽然protobuf很流行,并且系出名门,可是没怎么用过。通过阅读google developers里关于protocal-buffers的内容基本可以使用它了。如果你访问该链接https://developers.google.com/protocol-buffers/ 失败的话,肯能需要VPN服务。

语言手册:https://developers.google.com/protocol-buffers/docs/proto

Protobuf-Java:https://developers.google.com/protocol-buffers/docs/javatutorial

下载地址:https://developers.google.com/protocol-buffers/docs/downloads

如果是Windows系统建议下载protoc-2.6.0-win32.zip,这样即可省去编译。

官方提供的C++,Python,Java的运行库下载:https://code.google.com/p/protobuf/downloads/list 这里需要注意的是运行库的版本需要和protoc的版本对应。

下文是通过使用protocal-buffers官网提供的一个数据格式的例子来熟悉protocal buffer在Java开发中的基本使用方法。

1.编写一个.proto文件命名为:addressbook.proto,该文件内容来自protocal-buffers官网

packagetutorial;optionjava_package=”com.example.tutorial”;optionjava_outer_classname=”AddressBookProtos”;messagePerson{requiredstringname=1;requiredint32id=2;optionalstringemail=3;enumPhoneType{MOBILE=0;HOME=1;WORK=2;}messagePhoneNumber{requiredstringnumber=1;optionalPhoneTypetype=2[default=HOME];}repeatedPhoneNumberphone=4;}messageAddressBook{repeatedPersonperson=1;}

2.使用protoc-2.6.0-win32.zip解压后的protoc.exe生成Java类

查询protoc.exe帮助:

D:\__dev\jar\protobuff>protoc.exe-h

生成Java类:

D:\__dev\jar\protobuff>protoc.exe–proto_path=F:\__eclipse\test\proto–java_out=F:\__eclipse\test\srcF:\__eclipse\test\proto\addressbook.proto

在Eclipse中的项目目录结构图如下:

说明:

上图中:addressbook.proto数据格式文件,AddressBookProtos.java是生成的java类,protobuf-java-2.5.0.jar是Java运行时类库。

3.使用AddressBookProtos类来实现对象的序列号和反序列化,了解Protocol-buffers jar的相关API

代码实例:

packagecom.example.test;importjava.util.Arrays;importcom.example.tutorial.AddressBookProtos.AddressBook;importcom.example.tutorial.AddressBookProtos.Person;importcom.google.protobuf.InvalidProtocolBufferException;publicclassAddressBookProtoUse{publicstaticvoidmain(String[]args){//构建一个Person对象Personperson=Person.newBuilder().setEmail(“zhangsan@163.com”).setId(10086).setName(“zhangsan”).addPhone(Person.PhoneNumber.newBuilder().setNumber(“186”).setType(Person.PhoneType.HOME).build()).build();System.out.println(“打印输出Person对象信息:”);System.out.println(person);System.out.println(“Person对象调用toString()方法:”);System.out.println(person.toString());System.out.println(“Person对象字段是否初始化:”+person.isInitialized());//序列号System.out.println(“Person对象调用toByteString()方法:”);System.out.println(person.toByteString());System.out.println(“Person对象调用toByteArray()方法:”);System.out.println(Arrays.toString(person.toByteArray()));try{System.out.println(“反序列化后的对象信息:”);//反序列化PersonnewPerson=Person.parseFrom(person.toByteArray());System.out.println(newPerson);newPerson=Person.parseFrom(person.toByteString());System.out.println(newPerson);}catch(InvalidProtocolBufferExceptione){e.printStackTrace();}//向地址簿添加两条Person信息AddressBook.Builderbooks=AddressBook.newBuilder();books.addPerson(person);books.addPerson(Person.newBuilder(person).setEmail(“tom@163.com”).build());System.out.println(“AddressBook对象信息:”);System.out.println(books.build());}}

运行结果:

君子无故,玉不去身。

记录:ProtocolBuffers(protobuf)在Java开发中使用

相关文章:

你感兴趣的文章:

标签云: