代碼倉庫地址
一、介紹
Protobuf是Google旗下的一款平台無關,語言無關,可擴充的序列化結構資料格式。所以
很適合用做資料存放區和作為不同應用,不同語言之間相互連信的資料交換格式,只要實現相同的協議格式即同一proto檔案被編譯成不同的語言版本,加入到各自的工程中去,這樣不同語言就可以解析其他語言通過Protobuf序列化的資料。目前官網提供了C++,Python,JAVA,GO等語言的支援。
相對於JSON和XML具有以下優點:
簡潔
體積小:訊息大小隻需要XML的1/10 ~ 1⁄3
速度快:解析速度比XML快20 ~ 100倍
使用Protobuf的編譯器,可以產生更容易在編程中使用的資料存取碼
更好的相容性,Protobuf設計的一個原則就是要能夠很好的支援向下或向上相容
註:本文主要注重protobuf的使用,所以省去了下載、安裝的操作步驟。
二、建立一個test.proto檔案並產生test.pb.go檔案
syntax = "proto3"; //聲明使用proto3協議package test; //包名,通過protoc產生go檔案enum PhoneType{ HOME = 0; WORK = 1;}message Phone{ //訊息定義的關鍵字 PhoneType type = 1; string number = 2;}message Person{ int32 id = 1; string name = 2; repeated Phone phones = 3; //欄位可以被重複任意多次(包括0次)}message ContactBook{ repeated Person persons = 1;}
運行如下命令產生test.pb.go檔案
> protoc --go_out=. *.proto
注意 包名要和檔案夾名一致。
三、在Go語言中使用Protobuf
package mainimport ( "fmt" "io/ioutil" "os" "pftest/pf" "pftest/github.com/golang/protobuf/proto")func write() { p1 := &pf.Person{ Id: 1, Name: "小張", Phones: []*pf.Phone{ {pf.PhoneType_HOME, "11111111"}, {pf.PhoneType_WORK, "22222222"}, }, } p2 := &pf.Person{ Id: 2, Name: "小王", Phones: []*pf.Phone{ {pf.PhoneType_HOME, "33333333"}, {pf.PhoneType_WORK, "44444444"}, }, } p3 := &pf.Person{ Id: 3, Name: "小李", Phones: []*pf.Phone{ {pf.PhoneType_HOME,"55555555"}, {pf.PhoneType_WORK,"66666666"}, }, } book := &pf.ContactBook{} book.Persons = append(book.Persons, p1) book.Persons = append(book.Persons, p2) book.Persons = append(book.Persons, p3) data, _ := proto.Marshal(book) ioutil.WriteFile("./test.txt", data, os.ModePerm)}func read() { date, _ := ioutil.ReadFile("./test.txt") book := &pf.ContactBook{} proto.Unmarshal(date, book) for _, v := range book.Persons { fmt.Println(v.Id, v.Name) for _, vv := range v.Phones { fmt.Println(vv.Type, vv.Number) } }}func main() { write() read()}
運行結果如下:
四、參考資料
Google proto2 guideGoogle proto3 guide
golang 使用 protobuf 的教程
Protobuf簡介和使用
[轉]Protobuf3 文法指南_鳥窩
Golang版protobuf的安裝與使用
五、小結
如果有興趣想瞭解資料的操作,壓縮的全過程,可以考慮使用Protobuf。
它就像一個代碼轉換器,你只需寫好底層協議,然後用Protobuf現成的工具產生對應語言的源檔案,從而達到項目中使用相同協議格式進行資料轉送的目的。
這是我在工作中學習到的一個新技巧!