2

ネットワーク プロトコルでデータをシリアル化するために gob ("encoding/gob") を使用することを検討しています。いろいろと調べてみましたが、これらの問題の解決策が見つからないようです。

メッセージのフレーミング - gob のドキュメントは、TCP 接続を gob デコーダーでラップして読み取るだけでよいという印象を与えます。しかし、メッセージを半分しか受信しなかった場合はどうなりますか? gob はどうにかしてこれに対処できますか、それともメッセージ フレームを追加し、メッセージ データを gob のバッファにコピーしてシリアル化を解除する必要がありますか?

さまざまな種類のメッセージ - プロトコルにはさまざまな種類のメッセージがあります。これを gob で処理するにはどうすればよいですか? データのタイプを示すすべての gob blob の前に識別子を付けることによって? すべてのメッセージを、すべての異なるメッセージのフィールドを含む「マスター」メッセージに入れることによって (それを 1 つのタイプのメッセージだけに減らします)? 後者(より単純)を試してみましたが、オーバーヘッドが非常に大きいようです(> 650バイト)。

4

1 に答える 1

3

gob のドキュメントを見ると、TCP 接続を gob デコーダーでラップして読み取るだけでよいという印象を受けます。

正しい。このパッケージは、エンコーダーとデコーダーの間で複数の値をストリーミングするように設計されています。

しかし、メッセージを半分しか受信しなかった場合はどうなりますか?

デコーダーは、基礎となる io.Reader を呼び出してデータを取得します。リーダーがデータを返せない場合、リーダーはエラーを返します。デコーダーはこのエラーをアプリケーションに返します。

io.Reader がエラーを返した場合、デコード ストリームを回復する方法はありません。

さまざまな種類のメッセージ

メッセージのペアをエンコードして、最初のメッセージがアプリケーションに期待するタイプを 2 番目のメッセージで伝えることができます。

説明どおりに「マスター」タイプを作成することもできます。表示されるオーバーヘッドは、値ごとではなく、ストリームごとに 1 回発生します。

于 2015-06-29T15:34:54.690 に答える