一,什么是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); } }