Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从网络流反序列化XML失败_C#_.net_Xml Deserialization_Networkstream - Fatal编程技术网

C# 从网络流反序列化XML失败

C# 从网络流反序列化XML失败,c#,.net,xml-deserialization,networkstream,C#,.net,Xml Deserialization,Networkstream,我将应用程序设置为通过网络发送对象,方法是在发送端将对象序列化为XML,在接收端将对象反序列化。我首先使用UDP进行设置,效果很好。代码如下: 发件人: MemoryStream ms = new MemoryStream(); dataSerializer.Serialize(ms, dataToSend, serNamespaceRemover); senderClient.Send(ms.GetBuffer(), (int)ms.Length); 接收人: IPEndPoint beac

我将应用程序设置为通过网络发送对象,方法是在发送端将对象序列化为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>
这似乎很疯狂。为什么它不能直接从网络流中读取?我真的必须将数据读入MemoryStream,然后将其传递给反序列化程序吗?

请参阅:


这里的答案表明NetworkStream在读取最后一个字节时不会发出通知。因此,您的反序列化程序似乎一直在尝试从NetworkStream读取(即使在到达end之后;因为NetworkStream不会通知它),从而导致异常。您需要读入MemoryStream。

如何知道何时收到了整个XML文件?只要远程端没有关闭连接,调用
Read
(这
XmlSerializer
就可以)将阻塞并等待数据。

我以前确实遇到过这个问题,但在这种情况下,它不是阻塞而是读取无效的内容并引发异常。捕捉得好,我自己也是这么想的。为我节省了一些研究,我学到了一些新的东西:)很接近,但不认为这对你的情况有帮助。
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;