代码段:
//byte[] myByteArray = byte array from database (database BLOB)
myByteArray = (byte[]) ((dbCommand.Parameters["parameter"].Value));
string myString =System.Text.Encoding.UTF8.GetString(myByteArray);
Xmldocument doc = new Xmldocument();
doc.Load(myString);
============
我有时候会System.OutOfMemoryException
。
string myString = System.Text.Encoding.UTF8.GetString(myByteArray);
将bytearray转换为字符串时出现此错误。
有没有办法让这段代码变得健壮。
我想要做的就是在字节数组中加载BLOB,然后将它们转换为字符串 并将它们加载到xmldocument中以使用。
答案 0 :(得分:7)
如果您有一个包含XML文本的字符串,那么您实际上需要XmlDocument.LoadXML。 XmlDocument.Load将字符串视为URL。
也就是说,XmlDocument.Load有过载XmlReader,TextReader或Stream的重载。您可以在底层字节数组上创建一个MemoryStream,然后传递它;这可以避免字符串转换。
答案 1 :(得分:1)
XmlDocument.Load(String)尝试从作为参数给出的URL加载XML文档,即它尝试将您可能的巨大字符串解释为URL。难怪出现问题。
改为使用LoadXml()。
答案 2 :(得分:1)
听起来你的blob太大了,不能像字符串那样适合记忆。不要忘记,ASCII值的大小是二进制形式的字符串的两倍。无论如何, 这些价值有多大?
之后您需要对字符串做什么?您显示将其加载为XML(尽管正如Roger所说,您真的想要LoadXml)但不是您计划在此之后做的事情。你能做一些流式传输数据吗?如果是这样,将字节数组包装在MemoryStream中,然后在其上使用StreamReader。
答案 3 :(得分:0)
Strings / StringBuilders需要连续的内存块,因此OutOfMemoryException与堆的碎片密切相关。
话虽这么说,你需要对输入进行分块或者已经建议使用流。