protobuf在google中是一个比较核心的根本库,作为分布式运算涉及到大量的不同业务的通报,如何高效简洁的表示、操作这些业务在google这样的大规模运用中是至关主要的。而protobuf这样的库恰好是在效率、数据大小、易用性之间取得了很好的平衡。
官方文档http://code.google.com/p/protobuf/
Protobuf的优点如下:A、性能好,效率高: 序列化后字节占用空间比XML少3-10倍,序列化的韶光效率比XML快20-100倍。B、有代码天生机制: 将对构造化数据的操作封装成一个类,便于利用。C、支持向后和向前兼容: 当客户端和做事器同时利用一块协议的时候, 当客户端在协议中增加一个字节,并不会影响客户真个利用D、支持多种编程措辞: Protobuf目前已经支持Java,C++,Python、Go、Ruby等多种措辞。

Protobuf的缺陷如下:A、二进制格式导致可读性差B、缺少自描述
2. idea安装protobuf插件安装插件protobuf Support,之后重启
3. 配置maven依赖
<dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.4.0</version> </dependency></dependencies><build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.4.1.Final</version> </extension> </extensions> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.5.0</version> <configuration> <protocArtifact> com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier} </protocArtifact> <pluginId>grpc-java</pluginId> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins></build>
4. 书写proto文件
syntax="proto3";optionjava_package="com.jihite";optionjava_outer_classname="PersonModel";messagePerson{ int32id=1; stringname=2; stringemail=3;}
5. 转换成java文件
把天生的类考的代码路径下,用下面测试用例测试
packagecom.jihite;importcom.google.protobuf.InvalidProtocolBufferException;importorg.junit.Test;publicclassprotobufTest{ @Test publicvoidtestN()throwsInvalidProtocolBufferException{ PersonModel.Person.Builderbuilder=PersonModel.Person.newBuilder(); builder.setId(1); builder.setName("jihite"); builder.setEmail("jihite@jihite.com"); PersonModel.Personperson=builder.build(); System.out.println("before:"+person); System.out.println("===Person Byte:"); for(byteb:person.toByteArray()) { System.out.print(b); } System.out.println("================"); byte[]byteArray=person.toByteArray(); PersonModel.Personp2=PersonModel.Person.parseFrom(byteArray); System.out.println("after id:"+p2.getId()); System.out.println("after name:"+p2.getName()); System.out.println("after email:"+p2.getEmail()); }}
结果:
before:id:1name:"jihite"email:"jihite@jihite.com"===PersonByte:811861061051041051161012617106105104105116101641061051041051161014699111109================afterid:1aftername:jihiteafteremail:jihite@jihite.com