我目前正在尝试通过NetworkStream发送一个XmlDocument。
客户端:使用序列化器向流发送一个User类型的自定义对象。
XmlSerializer serializer = new XmlSerializer(typeof(User));
XmlWriter writer = new XmlTextWriter(_tcpStream, Encoding.Unicode);
serializer.Serialize(writer, user);
服务器端:接收流并将其加载到文档中进行进一步处理。
static XmlElement ReceiveXmlElementFromClient(TcpClient client)
{
Console.WriteLine("Receiving Element from client...");
XmlDocument document = new XmlDocument();
NetworkStream ns = client.GetStream();
Console.WriteLine("Reading buffer.");
byte[] bRead = new byte[client.ReceiveBufferSize];
ns.Read(bRead, 0, client.ReceiveBufferSize);
Stream reader = new MemoryStream(buffer.ToArray());
XmlReader r = new XmlTextReader(reader);
document.Load(r);
// document.Save("test.xml")
Console.WriteLine("Element received.");
return document.DocumentElement;
}
这导致了 "Root element is missing "的异常。
然而,当我在函数的早期(虽然不是在程序的早期)放置一个断点时,它就会像预期的那样工作。文档可以保存,也可以提取根元素,所有的格式都是正确的(和客户端一样)。
我发现这个帖子在C语言中似乎也有同样的问题。为什么设置一个断点能让我的代码工作?根据我的理解(从未接触过C语言),这个问题是关于一个类似于空的初始值。
byte[] bRead = new byte[client.ReceiveBufferSize];
基于这一点,我尝试了一个返回字节[]的本地函数,以及将所有字节分别添加到一个列表中。这些方法都不起作用。
我又找到了一个帖子,其中有一个解释让我想到了。在JavaEclipse中,为什么在我的代码中设置一个断点会改变该语句的效果? 其中一个答案提到,最终是一个线程在bakground中运行,没有时间在下一步之前完成。我试过这个我的让我的线程等待的方法是加一个秒表和一个5秒后断点的while-loop,但是徒劳无功。
现在我没有办法了,很困惑,如果有人能解释一下断点是做什么的,我错过了什么,我会非常高兴。
解决了,我只是把wait函数放在了错误的地方(应该是在 "读取缓冲区 "之前)。只是发送所有数据需要时间。