protobuf基礎概念和認知

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 的應用場景更爲豐富。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章