8

オブジェクト グラフをサーバー プロセスからクライアントに移動しようとしています。そして、それは機能します。少なくとも、クライアントとサーバーの両方が開発仮想マシン上にある場合は機能します。ベースマシン(dev vmのクライアント)でサーバーを実行するときにも機能します。

ただし、メディア センター PC でサーバーを実行すると、動作しなくなります。例外は次のとおりです。

バイナリ ストリーム '0' には、有効な BinaryHeader が含まれていません。考えられる原因は、無効なストリームまたはシリアル化と逆シリアル化の間のオブジェクト バージョンの変更です。

3 台の PC はすべて x64 Windows 7 マシンです。クラスと一緒に TCPClient と TCPListener を使用して、面倒な作業を行ってBinaryFormatterいます。

転送されるデータは、標準FileStreamオブジェクトを使用してファイルから読み取られます。

クライアント側でバッファをファイルにシリアル化すると、(BeyondCompare によると) 内容が実際には異なるように見えますか?!?

オブジェクトのすべての文字列プロパティは、セッターで Base64 エンコードされ、ゲッターでデコードされます。

コードを投稿できますが、問題の領域がどこにあるのかわかりません。何か案は?

4

1 に答える 1

1

更新:私はこの問題を解決したようです。クライアントがサーバーの応答を読み取るブレークポイントがありました

tcpClient.GetStream().Read(buffer, 0, buffer.Length);

そして、「問題のある」サーバーから読み取られたバイト数が少ないことに注意してください。簡単なグーグルの後、私はこの記事http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/759f3f2f-347b-4bd8-aa05-fb7f681c3426を見つけました。

これをよりエレガントに処理する方法はいくつかあります。接続を他の目的で再利用する予定がない場合は、nobugzが提案するのが最も簡単です。サーバーがデータの送信を完了したら、Close()で接続を終了します。クライアントが閉じる前に送信されたすべてのデータを読み取ると、読み取りは0を返し始めます。この時点で、サーバーは他に何も送信する予定がないことがわかります。

だから私は自分のコードを1回の読み取りから次のように更新しました:

var buffer = new byte[32768];
var totalBytesRead = 0;
var bytesRead = tcpClient.GetStream().Read(buffer, 0, buffer.Length);

do
{
      totalBytesRead += bytesRead;
      bytesRead = tcpClient.GetStream().Read(buffer, totalBytesRead, bytesRead);

} while (bytesRead > 0);

投稿に従って接続を閉じるようにサーバーコードを更新しました。@leppieからのコメントによると、Base64でラップされたプロパティを削除できる可能性があります...

于 2011-04-10T06:41:19.887 に答える