這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
ProtoBuf: 是一套完整的 IDL(介面描述語言),出自Google,基於 C++ 進行的實現,開發人員可以根據 ProtoBuf 的語言規範產生多種程式設計語言(Golang、Python、Java 等)的介面代碼,本篇只講述 Golang 的基礎操作。據說 ProtoBuf 所產生的二進位檔案在儲存效率上比 XML 高 3~10 倍,並且處理效能高 1~2 個數量級,這也是選擇 ProtoBuf 作為序列化方案的一個重要因素之一。
安裝:
- 安裝 protoc :Protoc下載地址,可以根據自己的系統下載相應的 protoc,windows 使用者統一下載 win32 版本。
配置 protoc 到系統的環境變數中,執行如下命令查看是否安裝成功:
$ protoc --version
如果正常列印 libprotoc 的版本資訊就表明 protoc 安裝成功
安裝 ProtoBuf 相關的 golang 依賴庫
$ go get -u github.com/golang/protobuf/{protoc-gen-go,proto}
使用
建立 Demo golang工程
Paste_Image.png
在 example 包中編寫 person.proto
syntax = "proto3"; package example; message person { // aa 會產生 Aa 命名的結構體 int32 id = 1; string name = 2; } message all_person { // aa_bb 會產生 AaBb 的駝峰命名的結構體 repeated person Per = 1; }
進入 Demo 工程的 example 目錄,使用 protoc 編譯 person.proto
$ protoc --go_out=. person.proto
就會產生 person.pb.go 檔案
在 golang 工程中使用 protobuf 進行序列化與還原序列化
main.go:
package main import ( "github.com/golang/protobuf/proto" "Demo/example" "log" ) func main() { // 為 AllPerson 填充資料 p1 := example.Person{ Id:*proto.Int32(1), Name:*proto.String("xieyanke"), } p2 := example.Person{ Id:2, Name:"gopher", } all_p := example.AllPerson{ Per:[]*example.Person{&p1, &p2}, } // 對資料進行序列化 data, err := proto.Marshal(&all_p) if err != nil { log.Fatalln("Mashal data error:", err) } // 對已經序列化的資料進行還原序列化 var target example.AllPerson err = proto.Unmarshal(data, &target) if err != nil{ log.Fatalln("UnMashal data error:", err) } println(target.Per[0].Name) // 列印第一個 person Name 的值進行還原序列化驗證 }