Protocol Buffers
(Protobuf)是一種輕量、高效且可擴展的數據交換格式,由 Google 開發並開源。
Protocol Buffers
Protobuf 定義了一種接口描述語言(Interface Definition Language,IDL),可以使用這種語言來定義數據結構
和數據格式
。定義完成後,Protobuf
提供了一個代碼生成工具
,可以根據這些定義自動生成
用於多種編程語言的序列化
和反序列化
代碼。
數據交換
是一個問題。傳統的文本格式如 JSON
和 XML
雖然易於閱讀和處理,但它們存在一些效率問題
。這就是 Protobuf 出現的原因。
高效性:二進制表示非常緊湊,佔用很少的存儲空間。相對於 JSON 或 XML,它更節省帶寬,並且序列化和反序列化的速度更快。
可讀性:定義文件是可讀的,可以使用版本控制工具進行跟蹤和管理。也可以通過 Proto 定義文件來自動生成代碼,使得 Protobuf 非常易於使用。
可擴展性:在不影響現有數據結構的情況下,添加新字段或更改現有字段的規範。這對於應對數據模式的變化非常有用。
多語言支持:提供多種語言的原生支持,包括 Golang、Java、C++、Python 等,這使不同語言的應用程序能夠相互通信。
Golang 的 Protobuf 由兩個部分組成
.proto
文件:用於定義數據的結構
。syntax = "proto3";
package example;
message Person {
string name = 1;
int32 age = 2;
}
Go 程式碼
:用於生成 Go 語言的代碼來序列化和反序列化數據。protoc --go_out=. person.proto
package main
import (
"fmt"
"github.com/golang/protobuf/proto"
)
type Person struct {
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
Age int32 `protobuf:"varint,2,opt,name=age" json:"age,omitempty"`
}
func main() {
person := &Person{
Name: "John Doe",
Age: 30,
}
// 序列化數據
data, err := proto.Marshal(person)
if err != nil {
fmt.Println(err)
return
}
// 反序列化數據
newPerson := &Person{}
err = proto.Unmarshal(data, newPerson)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(newPerson)
}
在 Golang 中,可以輕鬆使用 Protobuf,只需定義 Proto 文件,編譯然後在程式碼中使用生成的程式碼。這使得數據交換變得更加簡單且高效,並有助於減少帶寬和存儲的使用。