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. 更多資源
正文完