一,什么是Protobuf
官方文档给出的是:
a language-neutral, platform-neutral, extensible way of serializing structured data for use in communications protocols, data storage, and more.
二,Protobuf的优点
1,性能好,效率高
2,代码生成机制,数据解析类自动生成
3,支持向后兼容和向前兼容
4,支持多种编程语言(java,c++,python)
5,参考文档:http://blog.csdn.net/caisini_vc/article/details/5599468
三,Protobuf的缺点
1, 应用不够广
2, 二进制格式导致可读性差(二进制格式)
3, 缺乏自描述
官方文档描述如下:for instance, protocol buffers would not be a good way to model a text-based document with markup (e.g. HTML), since you cannot easily interleave structure with text
下面是自己的一个小案例:
第一步:准备两个文件 protoc.exe 和protobuf-Java-2.5.0.jar
第二步:建立一个工程test
第三部:建立一个msg.proto文件
option java_package = "com.protobuftest.protobuf"; 2 option java_outer_classname = "PersonProbuf"; 3 4 message Person 5 { 6 required string name = 1; 7 required int32 id = 2; 8 optional string email = 3; 9 10 enum PhoneType 11 { 12 MOBILE = 0; 13 HOME = 1; 14 WORK = 2; 15 } 16 17 message PhoneNumber 18 { 19 required string number = 1; 20 optional PhoneType type = 2 [default = HOME]; 21 } 22 23 repeated PhoneNumber phone = 4; 24 25 message CountryInfo 26 { 27 required string name = 1; 28 required string code = 2; 29 optional int32 number = 3; 30 } 31 } 32 33 message AddressBook 34 { 35 repeated Person person = 1; 36 } 第四步 :生成 java文件:在proto.exe目录下:protoc --java_out=./src ./proto/msg.proto
package com.bluedon.test; import java.util.List; import com.bluedon.proto.PersonProbuf; import com.bluedon.proto.PersonProbuf.Person; import com.bluedon.proto.PersonProbuf.Person.PhoneNumber; public class Test { public static void main(String[] args) { PersonProbuf.Person.Builder builder = PersonProbuf.Person.newBuilder(); builder.setEmail("xiaoming@163.com"); builder.setId(1); builder.setName("小明"); builder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("1001").setType(PersonProbuf.Person.PhoneType.MOBILE)); builder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("10086").setType(PersonProbuf.Person.PhoneType.MOBILE)); Person person = builder.build(); byte[] buf = person.toByteArray(); try{ Person person1 = PersonProbuf.Person.parseFrom(buf); System.out.println(person1.getName()+","+person1.getEmail()); List<PhoneNumber> list= person1.getPhoneList(); for (PhoneNumber phoneNumber : list) { System.out.println(phoneNumber.getNumber()); } }catch(Exception e){ e.printStackTrace(); } System.out.println(buf); } }