オブジェクトを送信側で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に読み込んでから、デシリアライザーに渡す必要がありますか?