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 不会在读取最后一个字节时发出通知。因此,您的解串器似乎一直在尝试从 NetworkStream 读取(即使在结束之后;因为 NetworkStream 没有通知它),因此会导致异常。您将需要读入 MemoryStream。

于 2013-03-08T20:50:09.957 回答
0

您如何知道何时收到了整个 XML 文件?只要远程端没有关闭连接,调用ReadXmlSerializer会这样做)就会阻塞并等待数据。

于 2013-03-08T20:50:37.583 回答