Protocol Buffers (協定緩衝區) 入門指南
1. 簡介
Protocol Buffers(簡稱 protobuf)是 Google 開發的一種語言無關、平台無關、可擴展的結構化資料序列化機制。與 JSON、XML 等序列化方式相比,protobuf 更小、更快、更簡單。
2. 安裝
2.1 安裝 protoc 編譯器
protoc 編譯器用於將 .proto 檔案編譯成特定程式語言的原始碼。
- 從 https://github.com/protocolbuffers/protobuf/releases 下載適合您平台的預編譯版本。
- 解壓縮後,將
bin目錄下的protoc可執行檔複製到系統的 PATH 環境變數包含的目錄下(例如/usr/local/bin)。 - 驗證安裝:
bash
protoc --version
2.2 安裝 protobuf 執行時環境
不同程式語言需要安裝相應的 protobuf 執行時環境。例如,對於 Go 語言:
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
確保將 $GOPATH/bin 添加到系統的 PATH 環境變數中,以便 protoc 可以找到 protoc-gen-go 外掛程式。
3. 定義訊息類型
建立一個 .proto 檔案,定義資料結構。例如,建立 student.proto:
syntax = "proto3";
package main;
message Student {
string name = 1;
bool male = 2;
repeated int32 scores = 3;
}
在目前目錄下執行以下命令,產生 Go 語言的程式碼:
protoc --go_out=. student.proto
這將產生 student.pb.go 檔案,包含了 Student 類型的 Go 語言實作。
4. 使用產生的程式碼
在 Go 語言中,可以使用產生的程式碼進行資料的序列化和反序列化。
package main
import (
"fmt"
"log"
"google.golang.org/protobuf/proto"
)
func main() {
student := &Student{
Name: "Alice",
Male: false,
Scores: []int32{90, 95, 100},
}
// 序列化
data, err := proto.Marshal(student)
if err != nil {
log.Fatal("Marshaling error: ", err)
}
// 反序列化
newStudent := &Student{}
err = proto.Unmarshal(data, newStudent)
if err != nil {
log.Fatal("Unmarshaling error: ", err)
}
fmt.Println("Student:", newStudent)
}
5. 欄位規則
optional:表示該欄位是可選的,可以設定值也可以不設定值。如果沒有設定值,將使用預設值進行初始化。repeated:表示該欄位可以重複任意次數使用,類似於動態陣列。
注意:在 proto3 中,required 關鍵字已被移除,所有欄位預設都是可選的。
6. 列舉和巢狀類型
可以在 .proto 檔案中定義列舉類型和巢狀的訊息類型。例如:
syntax = "proto3";
package main;
message Person {
string name = 1;
int32 id = 2;
string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phones = 4;
}
7. 向後相容性
在更新 .proto 檔案時,為了保持向後相容性,應遵循以下規則:
- 不要更改已有欄位的編號。
- 不要刪除已有的欄位。
- 可以新增新的欄位,但必須使用新的編號。
- 可以新增新的列舉值。
遵循這些規則可以確保舊的程式碼仍然可以解析新的訊息格式。
8. 更多資源
主題測試文章,只做測試使用。發佈者:Walker,轉轉請注明出處:https://walker-learn.xyz/archives/4460