1

オブジェクトをシリアル化してネットワーク経由で送信したい。クラスのISerializeable属性とBinaryFormatterを使用して、オブジェクトをバイトに変換するように設定しました。オブジェクトを送信し、受信側で逆シリアル化できます。ただし、オブジェクトを再構築する前にオブジェクト全体を確実に保持するために、ストリームと一緒にサイズを送信したいと思います。最初の数バイトをサイズとして設定し、受信したデータが少なくともこの固定サイズであるかどうかを確認すると、それを読み取ってオブジェクトのフルサイズを取得できます。次に、受信したデータがオブジェクトのサイズ+固定サイズのバイトになるまで待つだけです。オブジェクトのサイズを最初の数バイトとして格納し、オブジェクトを残りのバイトとして格納するintを送信できるように、ストリーム内のデータをオフセットするにはどうすればよいですか?

4

4 に答える 4

1

何を防ごうとしているのですか?TCPには、すでに整合性と信頼性のチェックが組み込まれています。

于 2010-11-03T23:16:59.597 に答える
1
MemoryStream resultStream = new MemoryStream();
resultStream.Write(BitConverter.GetBytes(objectStream.Length));
resultStream.Write(objectStream.ToArray());

// send the resultStream
于 2010-11-03T23:18:52.727 に答える
1

にシリアル化してMemoryStream、それが完了したら、からを追加し.Length、その後にデータを追加できますか(配列からバイトをMemoryStream使用GetBuffer()してコピーします)。.Length受信機で逆にします。長さ(通常は4バイト)を読み取り、その量のデータをMemoeryStream;にパックします。MemoryStream( )を巻き戻し、Position=0逆シリアル化します。もちろん、エンディアンなどに同意する必要があります。

(参照してください、そして私はprotについてさえ言及しませんでした...ああ、他のこと)

于 2010-11-03T23:19:06.320 に答える
1

正解は次のとおりです。

SocketPacket socketData = (SocketPacket)asyn.AsyncState;
socketData.currentSocket.EndReceive(asyn);
byte[] data = socketData.dataBuffer;   

SocketPacketから読み取る正しい方法ではありません

于 2010-11-03T23:44:50.700 に答える