長さプレフィックスの後に TCP 受信から構造体を逆シリアル化する
問題:
カスタムを逆シリアル化するとき別のマシンから TCP 経由で構造体を受信すると、例外が発生します。 "System.Runtime.InteropServices.SafeArrayTypeMismatchException".
元の実装:
構造体には、送信前後にデータを準備および取得するためのシリアル化メソッドが含まれています。受信データのサイズを示すために、送信されたバイトにヘッダーが「l=xxxx;」の形式で追加されます。受信側はこのヘッダーを検索し、パケット バイトを抽出し、それらを逆シリアル化しようとします。
例外の原因:
根本的な原因は、パケット長を決定するための文字列。この方法では、ネットワーク経由でデータを転送するときに不整合が発生する可能性があります。
解決策:
長さのプレフィックスの実装:
ヘッダー文字列を使用する代わりに、適切な長さの接頭辞を実装します。これには、送信される各「パケット」にデータの長さを表す固定ヘッダーを追加することが含まれます。この長さはバイトに変換され、4 バイトになります。次に、データ ヘッダーとパケット自体が追加されます。
パケット構造:
[長さ (4 バイト)][ヘッダー (1 バイト)][データ (x) byte(s))]
パケット受信と解析:
以上が長さプレフィックス付きの TCP ストリームから構造体を確実に逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。