为啥在执行我的代码 (XmlDocument.Load) 之前设置断点会阻止异常?
Posted
技术标签:
【中文标题】为啥在执行我的代码 (XmlDocument.Load) 之前设置断点会阻止异常?【英文标题】:Why does setting a breakpoint before the execution of my code (XmlDocument.Load) prevent exception?为什么在执行我的代码 (XmlDocument.Load) 之前设置断点会阻止异常? 【发布时间】:2020-08-21 09:10:41 【问题描述】:我目前正在尝试通过 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;
这会导致“缺少根元素”异常。
但是,当我在函数的前面放置断点时(尽管不是在程序的前面),它会按预期工作。可以保存文档以及提取根元素,所有这些都具有正确的格式(与客户端相同)。
我发现这个线程在 C:Why does setting a breakpoint make my code work? 中似乎有同样的问题 根据我的理解(从未接触过 C),问题是关于一个空的初始值,类似于:
byte[] bRead = new byte[client.ReceiveBufferSize];
基于此,我尝试使用返回 byte[] 的本地函数,并将所有字节分别添加到列表中。这些方法都不起作用。
我发现的另一个线程有一个让我想到的解释: In Java/Eclipse, why does setting a breakpoint in my code alter the effect of that statement? 一个答案提到它最终是一个在 bakground 中运行的线程,在下一步之前没有时间完成。我尝试通过添加一个秒表和一个在 5 秒后中断的 while 循环来让我的线程等待,但徒劳无功。
现在我没有想法,很困惑,如果有人能解释断点在做什么以及我缺少什么,我会非常高兴。
【问题讨论】:
您忽略了ns.Read(bRead, 0, client.ReceiveBufferSize);
的返回值,它为您提供了实际读取的字节数。您可能正在尝试使用不完整的缓冲区进行反序列化。您不需要使用中间内存流。直接将网络流 (ns) 馈送到您的 XmlTextReader。
【参考方案1】:
解决了,我只是把等待函数放错了地方(应该在“读取缓冲区”之前)。发送所有数据只是需要时间。
【讨论】:
以上是关于为啥在执行我的代码 (XmlDocument.Load) 之前设置断点会阻止异常?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?