protocol buffers(簡稱protobuf)是google搞的,是用來序列化資料的一種資料格式,類似于json、xml等這種。
本文其他概念不講直接講基本用法了。
首先需要定義資料結構,資料結構定義寫在一個擴充名是
.proto
的文本檔案裡面,這個檔案叫做
proto
檔案。
protobuf的資料叫
message
,每一個消息都是一系列名值對,我們把他叫做
fields
,當然還有更複雜的結構,這就不在這裡讨論了。
例如:
syntax = "proto3"; #版本
package tutorial; #包名
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
package
包名是為了避免不同項目的名字沖突。
上面就是我們定義的資料結構,然後用protobuf的編譯器
protoc
去生成指定語言的資料通路代碼,提供了簡便的方法來操作整個結構的二進制資料。
protobuf目前支援生成的代碼的有
java
、
python
、
Objective-C
、
C++
、
Dart
、
Go
、
Ruby
和
C#
。具體可以看https://developers.google.com/protocol-buffers/。
這裡以go語言為例,來測試一個試試。
首先需要安裝protobuf的C++編譯器。
可以參考這裡安裝:https://github.com/protocolbuffers/protobuf/blob/master/src/README.md
下面是參考步驟(系統是Debian9 64位系統,目前目錄在使用者的home目錄):
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.8.0/protobuf-cpp-3.8.0.tar.gz
tar -xzf protobuf-cpp-3.8.0.tar.gz
cd protobuf-3.8.0
./configure
make
sudo make install
安裝好後
protoc
指令就是可用了。
然後是安裝go語言代碼生成插件了。
參考說明:https://github.com/golang/protobuf
參考步驟:
go path設定:
GOPATH="/home/dev/gopath"
。
然後還要設定go path的bin目錄到
path
環境變量裡面去,這樣
protoc
才能找到插件,
export PATH="$PATH:$GOPATH/bin"
。
go get -u github.com/golang/protobuf/protoc-gen-go
一條指令就完成了,友善。
然後我們在資料定義同目錄下面執行指令
protoc --go_out=. *.proto
,就生成了對應的go代碼的。
更為完整的指令
protoc -I=/home/dev/grpc --go_out=/home/dev/grpc /home/dev/grpc/person.proto
,
-I
是源檔案目錄,
--go_out
是輸出go檔案的目标目錄,最後是指定要編譯的檔案。
其它語言也都是類似的方式生成對應語言的代碼。
執行完上面的指令之後,會生成一個
pb.go
的檔案。
生成了go檔案代碼之後,就可以讀寫
message
了。
說再多也不如直接上代碼來的明了。
建立了一個名稱是
protobuf_demo
測試項目,需要把上面生成的代碼複制到項目下面,
main.go
代碼如下:
//@link https://360us.net/
//https://360us.net/article/66.html
//http://www.tjingxuan.com/ 淘寶天貓優惠券
package main
import (
"log"
"io/ioutil"
pb "protobuf_demo/tutorial"
proto "github.com/golang/protobuf/proto"
)
func main(){
fname := "protobuf"
person := &pb.Person{
Name: "person1号",
Id: 10,
}
//寫
out, err := proto.Marshal(person)
if err != nil {
log.Fatalln("Failed to encode address book:", err)
}
if err := ioutil.WriteFile(fname, out, 0644); err != nil {
log.Fatalln("Failed to write address book:", err)
}
//讀
in, err := ioutil.ReadFile(fname)
if err != nil {
log.Fatalln("Error reading file:", err)
}
inPerson := &pb.Person{}
if err := proto.Unmarshal(in, inPerson); err != nil {
log.Fatalln("Failed to parse address book:", err)
}
log.Println(inPerson)
log.Println(inPerson.Name)
log.Println(inPerson.Id)
}
總體上就是通過
proto
包提供的
Marshal
和
Unmarshal
方法來編碼和解碼資料,沒有什麼複雜的操作。
protocol buffers
和xm,json這些類似的,都是用來編碼、解碼資料,友善傳輸、存儲來使用的。
本文的目的是希望新手(當然我也是新手)能夠快速的了解和使用
protocol buffers
,更多進階内容可以自行搜尋,或者通路官方說明。
希望本文對你有所幫助。
廣告時間:http://www.tjingxuan.com/
原文連結:https://360us.net/article/66.html