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

WBOY
リリース: 2024-02-06 10:30:11
転載
460 人が閲覧しました

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

質問内容

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

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

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

正解

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

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

hugemessage

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

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

.. ここで、

payload

には、いくつかの

hugemes sage

に対して

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

出力

等しい? true

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

rawrequest 型は request

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

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

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

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!