我需要创建一个大型XML文件,遗憾的是我无法控制。
XML的一个元素包含数十万个元素(最多500k),因此XElement的结果XML非常大,但仍然比我对OutOfMemory
异常的预期要小。
以下代码用于将对象序列化为XML,然后使用XmlReader来传输该XML并提取我需要的元素(这是巨大的)。我正在尝试压缩元素(使用GZip到Base64)然而,我甚至无法做到这一点,因为xmlReader.ReadOuterXml
会引发OutOfMemory
异常。
我尝试了各种方法,包括使用XmlDocument
(.InnerXml
/ .OuterXml
)和XDocument
与XElements
(.ToString()
)但是所有这些都抛出OutOfMemory
例外。
我首先尝试将我的元素转换为字符串的原因是因为我的压缩需要byte[]
- 我不确定在这种情况下我的方法是否有缺陷。
代码:
private string GetCompressed(object obj)
{
XmlSerializer serialiser = new XmlSerializer(obj.GetType());
// Serialise the XML to an XDocument so that we can manipulate it
using (MemoryStream memoryStream = new MemoryStream())
{
// Serialise to the memory stream
serialiser.Serialize(memoryStream, obj);
// Reset the position to 0.
memoryStream.Seek(0, SeekOrigin.Begin);
// Create an XML reader to stream out the results
using (XmlReader xmlReader = XmlReader.Create(memoryStream))
{
while (xmlReader.Read())
{
if (xmlReader.Name == "ElementIWant")
{
return CompressXML(xmlReader.ReadOuterXml()); //<= ReadOuterXml() throws OutOfMemory
}
}
}
}
return string.Empty;
}