1. 程式人生 > 其它 >Golang 序列化之 ProtoBuf

Golang 序列化之 ProtoBuf

ProtoBuf: 是一套完整的 IDL(介面描述語言),出自Google,基於 C++ 進行的實現,開發人員可以根據 ProtoBuf 的語言規範生成多種程式語言(Golang、Python、Java 等)的介面程式碼,本篇只講述 Golang 的基礎操作。據說 ProtoBuf 所生成的二進位制檔案在儲存效率上比 XML 高 3~10 倍,並且處理效能高 1~2 個數量級,這也是選擇 ProtoBuf 作為序列化方案的一個重要因素之一。

安裝

1.安裝 protoc :Protoc下載地址(https://github.com/google/protobuf/releases),可以根據自己的系統下載相應的 protoc,windows 使用者統一下載 win32 版本。

2.配置 protoc 到系統的環境變數中,執行如下命令檢視是否安裝成功:

$ protoc --version
# 如果正常列印 libprotoc 的版本資訊就表明 protoc 安裝成功

3.安裝 ProtoBuf 相關的 golang 依賴庫

$ go get -u github.com/golang/protobuf/{protoc-gen-go,proto}

使用

1.建立 Demo golang工程

2.在 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;
 }

3.進入 Demo 工程的 example 目錄,使用 protoc 編譯 person.proto

$ protoc --go_out=. person.proto
# 就會生成 person.pb.go 檔案

4.在 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 的值進行反序列化驗證
 }