protobufgo:高效、靈活、跨語言的數據序列化與反序列化

一、protobuf構建

protobuf是一種輕量級、高效、平台無關、語言無關、擴展性強的數據序列化和反序列化協議。在protobuf中,開發者可以通過定義消息格式,自動生成數據訪問API,從而達到數據傳輸和存儲的目的。

protobufgo是Golang社區提供的一種開源工具,旨在為Golang開發者提供高效、靈活、跨語言的protobuf序列化和反序列化功能。使用protobufgo,我們可以方便地通過protobuf定義文件,生成Golang訪問API,並且可以與其他語言的protobuf代碼進行互操作。

我們可以通過以下步驟來構建protobufgo:

// 安裝protobuf工具
$ go get github.com/golang/protobuf/proto

// 安裝protobufgogo插件
$ go get github.com/gogo/protobuf/proto
$ go get github.com/gogo/protobuf/protoc-gen-gogo

二、protobuf工具

protobufgo提供了許多有用的工具,可以幫助我們更輕鬆地開發和維護代碼。以下是一些常用的工具:

1. protoc

protoc是protobuf官方提供的編譯器,負責將protobuf定義文件編譯成不同語言的訪問API。protobufgo通過gogo/protobuf插件對protoc進行了擴展,提供了更多的選項和功能,例如生成更快的序列化和反序列化方法、支持不同語言之間的互操作等。

2. protoc-gen-go

protoc-gen-go是protobuf官方提供的Golang插件,用於將protobuf定義文件編譯成Golang訪問API。protobufgo提供了gogo/protobuf插件,可以生成更高效的序列化和反序列化方法,也可以支持更多的選項和功能,例如生成google.golang.org/genproto包下的Golang protobuf代碼。

3. protoc-gen-gofast

protoc-gen-gofast是protobufgo提供的一個更快的Golang插件,它基於gogo/protobuf插件進行了優化,生成的代碼速度更快。

4. protoc-gen-grpc-gateway

protoc-gen-grpc-gateway是一個開源的grpc轉換代理,可以將標準的grpc服務轉換成RESTful的API介面,支持多種編程語言,包括Golang。

三、protobuf公參

protobuf定義文件定義了消息的結構和欄位信息,類似於Golang中的struct,包括以下4個要素:

1. package

指定生成的代碼所在的Golang代碼包。

2. import

導入其他protobuf定義文件。

3. message

定義消息結構和欄位信息。

4. service

定義伺服器和客戶端之間的遠程調用介面。

以下是一個簡單的protobuf定義文件的示例:

    syntax = "proto3";
    package example;
    
    import "google/protobuf/timestamp.proto";
    
    message Person {
        string name = 1;
        int32 age = 2;
        repeated string email = 3;
        google.protobuf.Timestamp created_time = 4;
    }
    
    service PersonService {
        rpc GetPerson (PersonRequest) returns (PersonResponse);
    }
    
    message PersonRequest {
        string name = 1;
    }
    
    message PersonResponse {
        Person person = 1;
    }

四、protobuf構建與移植

protobufgo提供了多種選項和調用方式,以滿足不同平台和應用場景的需要。總體而言,protobufgo可以分為以下3個部分進行構建和移植:

1. protoc編譯器

protoc編譯器是protobufgo的核心,可以將protobuf定義文件編譯成不同語言的訪問API。protobufgo通過gogo/protobuf插件對protoc進行了擴展,提供了更多的選項和功能,例如生成更快的序列化和反序列化方法、支持不同語言之間的互操作等。以下是一些常用的命令:

// 編譯proto文件
$ protoc --proto_path=$GOPATH/src:. --gogo_out=. file.proto

// 支持生成其他語言的代碼,例如Java:
$ protoc --proto_path=$GOPATH/src:. --java_out=. file.proto

2. gogo/protobuf插件

gogo/protobuf插件是protobufgo提供的一種高效、靈活、跨語言的protobuf序列化和反序列化庫。在Golang應用程序中使用protobufgo,需要先將protobuf定義文件編譯成Golang訪問API,然後將生成的代碼導入到應用程序中。以下是一些常用的命令:

// 安裝插件
$ go get github.com/gogo/protobuf/proto
$ go get github.com/gogo/protobuf/protoc-gen-gogo

// 編譯proto文件
$ protoc --proto_path=$GOPATH/src:. --gogo_out=. file.proto

3. 應用程序

在應用程序中使用protobufgo,需要導入protobuf生成的Golang代碼,並定義和使用消息結構體。

import "example/file.pb.go"

func main() {
    person := &example.Person{
        Name: "Tom",
        Age:  28,
        Email: []string{"tom@example.com", "tom@gmail.com"},
        CreatedTime: &timestamp.Timestamp{
            Seconds: time.Now().Unix(),
        },
    }
    data, _ := proto.Marshal(person)
    newPerson := &example.Person{}
    _ = proto.Unmarshal(data, newPerson)
}

五、protobuf共享內存

protobufgo支持將消息數組序列化到共享內存中,以實現進程之間的數據傳遞和共享。以下是一些常用的命令:

// 獲取消息佔用的共享內存大小
size := proto.Size(msg)

// 分配共享內存
shmID, err := ipc.ShmGet(1, size, ipc.IPC_CREAT|ipc.IPC_EXCL|0666)

// 將消息序列化到共享內存
msgBytes, err := proto.Marshal(msg)
shmbuf, err := ipc.Shmat(shmID, uintptr(0), 0)
copy((*((*[1 << 30]byte)(unsafe.Pointer(shmbuf))))[:size], msgBytes)
ipc.Shmdt(shmbuf)

// 從共享內存中反序列化消息
shmbuf, err = ipc.Shmat(shmID, uintptr(0), 0)
unmarshMsg := &T{}
_ = proto.Unmarshal(shmbuf[:size], unmarshMsg)
ipc.Shmdt(shmbuf)

六、protobuf工具轉json

protobufgo支持將消息序列化為JSON字元串,以方便在HTTP API中傳輸和返回。以下是一些常用的命令:

// 將消息序列化為JSON字元串
buf, err := protojson.Marshal(msg)

// 將JSON字元串反序列化為消息
newMsg := &T{}
_ = protojson.Unmarshal(buf, newMsg)

上述代碼片段中的T代表消息結構體。

七、總結

protobufgo是一種高效、靈活、跨語言的數據序列化和反序列化協議,提供了強大的命令工具和訪問API,可以幫助我們更輕鬆地開發和維護代碼。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/196099.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-03 09:53
下一篇 2024-12-03 09:53

相關推薦

  • Python序列的常用操作

    Python序列是程序中的重要工具,在數據分析、機器學習、圖像處理等很多領域都有廣泛的應用。Python序列分為三種:列表(list)、元組(tuple)和字元串(string)。…

    編程 2025-04-28
  • Trocket:打造高效可靠的遠程控制工具

    如何使用trocket打造高效可靠的遠程控制工具?本文將從以下幾個方面進行詳細的闡述。 一、安裝和使用trocket trocket是一個基於Python實現的遠程控制工具,使用時…

    編程 2025-04-28
  • Python生成列表最高效的方法

    本文主要介紹在Python中生成列表最高效的方法,涉及到列表生成式、range函數、map函數以及ITertools模塊等多種方法。 一、列表生成式 列表生成式是Python中最常…

    編程 2025-04-28
  • Python整數序列求和

    本文主要介紹如何使用Python求解整數序列的和,給出了多種方法和示例代碼。 一、基本概念 在Python中,整數序列指的是一組整數的集合,可以使用列表(list)或元組(tupl…

    編程 2025-04-27
  • TFN MR56:高效可靠的網路環境管理工具

    本文將從多個方面深入闡述TFN MR56的作用、特點、使用方法以及優點,為讀者全面介紹這一高效可靠的網路環境管理工具。 一、簡介 TFN MR56是一款多功能的網路環境管理工具,可…

    編程 2025-04-27
  • 用Pythonic的方式編寫高效代碼

    Pythonic是一種編程哲學,它強調Python編程風格的簡單、清晰、優雅和明確。Python應該描述為一種語言而不是一種編程語言。Pythonic的編程方式不僅可以使我們在編碼…

    編程 2025-04-27
  • Python序列最大值的實現方法

    本篇文章主要介紹如何使用Python尋找序列中的最大值,在文章中我們將通過多個方面,詳細闡述如何實現。 一、Python內置函數max() 使用Python內置函數max()可以快…

    編程 2025-04-27
  • Python生成10萬條數據的高效方法

    本文將從以下幾個方面探討如何高效地生成Python中的10萬條數據: 一、使用Python內置函數生成數據 Python提供了許多內置函數可以用來生成數據,例如range()函數可…

    編程 2025-04-27
  • Morphis: 更加簡便、靈活的自然語言處理工具

    本文將會從以下幾個方面對Morphis進行詳細的闡述: 一、Morphis是什麼 Morphis是一個開源的Python自然語言處理庫,用於處理中心語言(目前僅支持英文)中的詞性標…

    編程 2025-04-27
  • Gino FastAPI實現高效低耗ORM

    本文將從以下多個方面詳細闡述Gino FastAPI的優點與使用,展現其實現高效低耗ORM的能力。 一、快速入門 首先,我們需要在項目中安裝Gino FastAPI: pip in…

    編程 2025-04-27

發表回復

登錄後才能評論