ホームページ  >  記事  >  バックエンド開発  >  既存の protobuf バイナリを含むメッセージをマーシャリングするときに、それを再利用できますか? (protobuf3)

既存の protobuf バイナリを含むメッセージをマーシャリングするときに、それを再利用できますか? (protobuf3)

WBOY
WBOY転載
2024-02-06 10:30:11479ブラウズ

在编组包含它的消息时,我可以重用现有的 protobuf 二进制文件吗?(protobuf3)

質問内容

protobuf は次のように定義されています。 リーリー

あるケースでは、誰かから

hugemessage を受け取り、それに追加のフィールドをパックして、そのメッセージを他の人に送信したいと思いました。したがって、hugemessage バイナリ unmarshal# を go 構造に入れ、それを request にパッケージ化してから、再度 marshal する必要があります。 hugemessage のサイズが膨大なため、unmarshalmarshal のコストは法外に高くなります。それでは、protobuf 定義を変更せずに hugemes sage バイナリを再利用できますか? <pre class="brush:protobuf;toolbar:false;">syntax = &quot;proto3&quot; message hugemessage { // omitted } message request { string name = 1; hugemessage payload = 2; } </pre>

正解

簡単に言えば、「いいえ、これを達成する簡単な標準的な方法はありません。」です。

最も明白な戦略は、現在行っている方法で実行することです。

hugemessage

をアンマーシャリングし、request に設定し、再度マーシャリングします。 Golang の protobuf API サーフェスは、実際にはそれ以上のことを行う方法を提供しませんが、それには十分な理由があります。 とはいえ、やりたいことを実現する方法は

あります。ただし、これらは必ずしも安全または信頼できるものではないため、そのコストと現在のものを比較検討する必要があります。 非整列化を回避する 1 つの方法は、メッセージが通常シリアル化される方法を利用することです。 リーリー ###..に相当 ### リーリー

.. ここで、

payload

には、いくつかの

hugemes sage

に対して

marshal(...) を呼び出した結果が含まれます。 したがって、次の定義があるとします: リーリー 次のコード: リーリー

出力

等しい? true

この「癖」が完全に信頼できるかどうかは不明であり、無期限に機能し続けるという保証はありません。明らかに、

rawrequest 型は request

型を正確にミラーリングする必要がありますが、これは理想的ではありません。

もう 1 つのオプションは、より手動の方法でメッセージを構築することです。つまり、protowire パッケージを使用します。これも自由ですが、注意することをお勧めします。

以上が既存の protobuf バイナリを含むメッセージをマーシャリングするときに、それを再利用できますか? (protobuf3)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。