我遇到了从网络流反序列化数据的问题。打开套接字后,第一个读取语句成功,但后续尝试反序列化数据块而没有错误(尽管它最终会超时)。
我已检查过正确的数据是否已发送且是否正确形成。为了确认这一点,我尝试了相同的代码和相同的数据,但使用了文件流。我没有得到相同的行为 - 反序列化步骤不会阻止。
我意识到文件流和网络流有一些差异但我希望行为是一样的。
TcpClient client = new TcpClient();
client.Connect(Server, Port);
NetworkStream stream = client.GetStream();
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlReader reader = XmlReader.Create(stream, settings);
MyData recievedData;
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyData ));
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && xmlReader.Name == "MyRoot")
{
// The following statement blocks
recievedData= (MyData)xmlSerializer.Deserialize(reader);
}
}
经过一些额外的测试后,我注意到如果我强制服务器重新发送相同的消息,反序列化步骤将正确恢复。然而,subseqent read语句也将起作用(拾取重复的消息),然后在反序列化步骤中再次阻塞。
可能还值得一提的是,消息是单个元素。如下所示:
<MyRoot xmlns="http://www.mydomain.com/mydata" someattribute="123" />