介紹——what
通常解釋爲,Protocol Buffers 是一種輕便高效的結構化數據存儲格式,可以用於結構化數據串行化,或者說序列化。它很適合做數據存儲或 RPC 數據交換格式。可用於通訊協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。簡要理解爲,Protocol Buffers是數據結構化格式,類似於JSON、XML。
使用——how
使用Protocol Buffers可以分爲以下幾個步驟:
- 定義*.proto格式文件,用來結構化數據,或者使用Protocol 語法來定義一個數據結構(C/S間通信或者對象序列化的數據結構)。
- 運行protocol編譯器編譯*.proto文件爲指定語言(Java、go、c都可以)的類。
- 數據的讀和寫(序列化和反序列化)——每個protocol編譯後的類都有使用二進制格式寫和讀你所定義的類型的消息的方法 。
例子
step 1——————創建Model.proto文件
package protobuf
message People{
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
step 2——————–編譯爲指定語言的類
//安裝Protocol Buffers 編譯器protoc
//編譯Model.proto
protoc --java(生成類的語言)_out=./src(生成目錄) ./proto/Model.proto(根據的proto文件)
step 3——————–序列化和反序列化
//example1--序列化將數據傳輸出去,網絡輸出
//構建數據
Model.People.Builder peopleBuilder = Model.People.newBuilder();
peopleBuilder.setName("name1") ;
peopleBuilder.setId(10) ;
peopleBuilder.setEmail("[email protected]")
Model.People people=peopleBuilder.build();
//將對象寫入輸出流,通過二進制輸出。
ByteArrayOutputStream output = new ByteArrayOutputStream();
people.writeTo(output);
byte[] byteArray = output.toByteArray();
//////////////////////////
//example2--反序列化,對象數據從二進制中讀取出來,byteArray爲網絡上傳過來的二進制
ByteArrayInputStream input = new ByteArrayInputStream(byteArray);
// 反序列化
Model.People people= Model.People.parseFrom(input);
//獲取people中的信息
好處——Why
沒有對比就沒有傷害
Protobuf:優點,傳輸速度快,可以方便的生成數據存取類,數據更小,在大多數平臺上都有很好的支持。缺點,應用不夠廣,二進制格式導致可讀性差,缺乏自描述。
JSON:人類可讀/可編輯,可以提前解析模式,卓越的瀏覽器支持,比XML更冗長。
XML:人類可讀/可編輯,可以提前解析模式,SOAP等標準
良好的工具支持(xsd,xslt,sax,dom等),相當冗長。