ホームページ >バックエンド開発 >Golang >Go で不明なプロトコル バッファをアンマーシャリングするにはどうすればよいですか?

Go で不明なプロトコル バッファをアンマーシャリングするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-23 08:45:15795ブラウズ

How to Unmarshal Unknown Protocol Buffers in Go?

Go での不明なプロトコル バッファーのアンマーシャリング

プロトコル バッファー (protobuf) を使用する場合、受信したメッセージのタイプが異なる状況が発生する可能性があります。は不明です。これは、複数のソースからのメッセージをリッスンする場合、または動的または予測不可能なメッセージ タイプを処理する場合に発生する可能性があります。

Protobuf のデフォルトの Unmarshal 関数では、特定のメッセージ タイプを引数として渡す必要がありますが、メッセージが種類は不明です。一般的なアプローチは、インターフェースへのアンマーシャリングを試みることです。{} しかし、これは Protobuf ライブラリではサポートされていません。

制限への対処

不明なメッセージを処理するには、カスタム アプローチを実装する必要があります。 1 つの解決策は、protobuf メッセージのワイヤー表現への低レベルのアクセスを提供する protowire パッケージを使用することです。

不明なメッセージの解析

次のコード スニペットは、その方法を示しています。不明な protobuf メッセージを解析して情報を抽出するには:

type Field struct {
    Tag
    Val
}

type Tag struct {
    Num int32
    Type protowire.Type
}

type Val struct {
    Payload interface{}
    Length int
}

func parseUnknown(b []byte) []Field {
    // ...
}

parseUnknownこの関数はバイト配列を反復処理し、フィールドを消費し、各フィールドのタグと値に関する基本情報を抽出します。

ペイロードの抽出

抽出された値のペイロードは、さまざまな形式で保存できます。予想されるフィールドのタイプと内容に応じて、データ構造の。例:

switch t {
case protowire.VarintType:
    v, vlen := protowire.ConsumeVarint(b[taglen:fieldlen])
case protowire.Fixed64Type:
    v, vlen := protowire.ConsumeFixed64(b[taglen:fieldlen])
// ...
}

制限と考慮事項

このアプローチには特定の制限があります:

  • 曖昧さ: protobuf メッセージのワイヤー表現は曖昧な場合があり、値の正確なタイプを判断することが困難になります。
  • 不明なフィールド: 不明またはサポートされていないフィールド タイプは解析または保存されません。
  • サブメッセージ: サブメッセージは再帰的に解析されますが、型情報は失われます。
  • 繰り返しフィールド: 繰り返しフィールドは明示的に処理されません。

不明なメッセージの解析の代替手段

ほとんどのシナリオでは、不明なメッセージの問題にアプローチすることが望ましいです。違う視点からのメッセージなど、 as:

  • 汎用メッセージへのマッピング: 考えられるすべてのフィールドをカプセル化できる汎用メッセージ タイプを作成し、不明なメッセージをこの汎用タイプにマップします。
  • Any Proto の使用: 未知のメッセージをカプセル化し、後で使用できるように型情報を保存するには、Any プロト型の使用を検討してください。 retrieval.

この記事で説明されているアプローチは、未知の protobuf メッセージから基本情報を抽出する方法を提供しますが、他のオプションが実行できない場合のフォールバック ソリューションとして使用する必要があります。

以上がGo で不明なプロトコル バッファをアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。