Protocol Buffers - google的數據交換協議。
Protobuf 官方定義:
protocol buffers 是一種語言無關、平臺無關、可擴展的序列化結構數據的方法,它可用於(數據)通信協議、數據存儲等。
Protocol Buffers 是一種靈活,高效,自動化機制的結構數據序列化方法-可類比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更爲簡單。
序列化[1]:將結構數據或對象轉換成能夠被存儲和傳輸(例如網絡傳輸)的格式,同時應當要保證這個序列化結果在之後(可能在另一個計算環境中)能夠被重建回原來的結構數據或對象。
特點:
語言無關、平臺無關。即 ProtoBuf 支持 Java、C++、Python 等多種語言,支持多個平臺
高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更爲簡單
擴展性、兼容性好。你可以更新數據結構,而不影響和破壞原有的舊程序
使用protobuf
go 中
https://github.com/golang/protobuf
protoc --go_out=. *.proto
生成後綴 .pb.go
第一步,創建 .proto 文件,定義數據結構,如下例1所示:
// 例1: 在 xxx.proto 文件中定義 Example1 message
message Example1 {
optional string stringVal = 1;
optional bytes bytesVal = 2;
message EmbeddedMessage {
int32 int32Val = 1;
string stringVal = 2;
}
optional EmbeddedMessage embeddedExample1 = 3;
repeated int32 repeatedInt32Val = 4;
repeated string repeatedStringVal = 5;
}
我們在上例中定義了一個名爲 Example1 的 消息,語法很簡單,message 關鍵字後跟上消息名稱:
message xxx {
}
之後我們在其中定義了 message 具有的字段,形式爲:
message xxx {
// 字段規則:required -> 字段只能也必須出現 1 次
// 字段規則:optional -> 字段可出現 0 次或1次
// 字段規則:repeated -> 字段可出現任意多次(包括 0)
// 類型:int32、int64、sint32、sint64、string、32-bit ....
// 字段編號:0 ~ 536870911(除去 19000 到 19999 之間的數字)
字段規則 類型 名稱 = 字段編號;
}
= 後的數字爲 :編號。
第二步, protoc 編譯 .proto 文件生成 讀寫接口
我們在 .proto 文件中定義了數據結構,這些數據結構是面向開發者和業務程序的,並不面向存儲和傳輸。
當需要把這些數據進行存儲或傳輸時,就需要將這些結構數據進行序列化、反序列化以及讀寫。那麼如何實現呢?不用擔心, ProtoBuf 將會爲我們提供相應的接口代碼。如何提供?答案就是通過 protoc 這個編譯器。
// $SRC_DIR: .proto 所在的源目錄
// --cpp_out: 生成 c++ 代碼
// $DST_DIR: 生成代碼的目標目錄
// xxx.proto: 要針對哪個 proto 文件生成接口代碼
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto
第三步,調用接口實現序列化、反序列化以及讀寫
針對第一步中例1定義的 message,我們可以調用第二步中生成的接口,實現測試代碼如下:
XML、JSON、ProtoBuf 都具有數據結構化和數據序列化的能力
XML、JSON 更注重數據結構化,關注人類可讀性和語義表達能力。ProtoBuf 更注重數據序列化,關注效率、空間、速度,人類可讀性差,語義表達能力不足(爲保證極致的效率,會捨棄一部分元信息)
ProtoBuf 的應用場景更爲明確,XML、JSON 的應用場景更爲豐富。