protobuf は次のように定義されています。 リーリー
あるケースでは、誰かからhugemessage を受け取り、それに追加のフィールドをパックして、そのメッセージを他の人に送信したいと思いました。したがって、
hugemessage バイナリ
unmarshal# を go 構造に入れ、それを request にパッケージ化してから、再度 marshal
する必要があります。 hugemessage のサイズが膨大なため、unmarshal
と marshal のコストは法外に高くなります。それでは、protobuf 定義を変更せずに hugemes sage バイナリを再利用できますか?
<pre class="brush:protobuf;toolbar:false;">syntax = "proto3"
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 サイトの他の関連記事を参照してください。