0

オブジェクトを送信側でXMLにシリアル化し、受信側で逆シリアル化することにより、ネットワーク経由でオブジェクトを送信するようにアプリケーションを設定しました。私は最初にUDPでセットアップしましたが、これは正常に機能しました。そのようなコード:

送信者:

MemoryStream ms = new MemoryStream();
dataSerializer.Serialize(ms, dataToSend, serNamespaceRemover);
senderClient.Send(ms.GetBuffer(), (int)ms.Length);

受信者:

IPEndPoint beaconEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), SharedData.udpPort);
byte[] receiveData = beaconClient.Receive(ref beaconEndpoint);
MemoryStream ms = new MemoryStream(receiveData);
CommData recieved = dataDeserializer.Deserialize(ms) as CommData;

ここで、TCPを使用するために切り替える必要があります。送信者は正常に機能しているようで、非常にシンプルです。

dataSerializer.Serialize(senderClient.GetStream(), dataToSend, serNamespaceRemover);

しかし、受信機に問題があります。私は単純で明白なことを試みました:

NetworkStream netstr = client.GetStream();
CommData data = dataDeserializer.Deserialize(netstr) as CommData;

そして、例外が発生します。XMLドキュメントにエラーがあります(5、14)。XMLは次のようになります。

<?xml version="1.0"?>
<CommData>
  <RigName>Rig 100</RigName>
  <IsShutDown>false</IsShutDown>
</CommData>

したがって、5,14の位置は、受信したデータの終了後2文字です。データをchar配列に読み込んで、閉じ括弧の終わりの後に何もないことを確認したので、デシリアライザーが何について話しているのかわかりません。

一方、これを行うと、レシーバーは機能します。

NetworkStream netstr = client.GetStream();
byte[] arry = new byte[client.Available];
netstr.Read(arry, 0, client.Available);
MemoryStream ms = new MemoryStream(arry);
CommData data = dataDeserializer.Deserialize(ms) as CommData;

これはおかしいようです。NetworkStreamから直接読み取れないのはなぜですか?本当にデータをMemoryStreamに読み込んでから、デシリアライザーに渡す必要がありますか?

4

2 に答える 2

1

参照:TCP経由で送信されたデータの逆シリアル化

そこでの答えは、NetworkStreamが最後のバイトが読み取られたときに通知しないことを示唆しています。したがって、deserlializerはNetworkStreamから(終了に達した後でも、NetworkStreamが通知しないため)読み込もうとし続けるため、例外が発生するようです。MemoryStreamに読み込む必要があります。

于 2013-03-08T20:50:09.957 に答える
0

XMLファイル全体を受け取ったことをどのようにして知ることができますか?リモートエンドが接続を閉じていない限り、呼び出しRead(これによりXmlSerializer)はデータをブロックして待機します。

于 2013-03-08T20:50:37.583 に答える