c# - 为什么我的新 XmlTextReader(stream) 以数兆字节读入内存而不是正确地流式传输?

标签 c# xml stream out-of-memory xmlreader

当以 XML 格式流式传输到 XmlReader 时,出现内存不足异常!查看内存分析器,我们可以看到它一遍又一遍地调用 StringBuilder.Append,导致大量 128KB 缓冲区填满所有内存。

这与“流”完全相反。它不应加载超过一个 4KB 的缓冲区。

最佳答案

通读 .NET 源代码,发现有一种“v1compat”模式确实会超前读取,违背了流式传输的目的。那么,如何避免让它进入那种愚蠢的模式呢?

事实证明,调用“new XmlTextReader(stream)”和“XmlReader.Create(stream)”之间存在巨大差异,Microsoft 没有费心记录...而且我在任何地方的任何帖子中都找不到。 .. 前者将其置于“v1compat”模式!!!

Sooo,除非您需要 XmlReader 的行为与它在 .NET 1.1 中完全一样,包括不正确的流行为,否则您永远不应该调用“new XmlTextReader(stream)”...而是使用“XmlReader.Create(stream)” ' 或采用 XmlReaderSettings 的变体之一,如果您需要尝试匹配使用的 XmlTextReader 设置(如果您不传递 XmlReaderSettings,那么至少某些设置会有所不同......我不确定是什么设置最好匹配“new XmlTextReader”...如果有人知道,请在此处添加!

关于c# - 为什么我的新 XmlTextReader(stream) 以数兆字节读入内存而不是正确地流式传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32940927/

相关文章:

c# - 读取大型 xml 文件并将其数据提取到 C#.Net 项目中的表单应用程序中

android - 中断 HttpURLConnection 请求 Android

c# - 将 key 转换为 VirtualKeyCode

c# - uwp 应用程序(.net native )和未处理的异常

c# - 如何在 ElasticSearch 中设置索引的 TTL

c# - 可以使用 Dapper 流式传输大型 SQL Server 数据库结果集吗?

c++ - Arduino:Serial.find(char) 不工作

c# - 如何在 C# 中将 IEnumerable<T> 列表转换为数据表

XML Schema 为多个子元素添加唯一的 id

python - 从 XML 中删除 ns0