写出巨大的XElement作为XML字符串 - OutOfMemory Exception

时间:2017-03-16 10:25:20

标签: c# xml

我需要创建一个大型XML文件,遗憾的是我无法控制。

XML的一个元素包含数十万个元素(最多500k),因此XElement的结果XML非常大,但仍然比我对OutOfMemory异常的预期要小。

以下代码用于将对象序列化为XML,然后使用XmlReader来传输该XML并提取我需要的元素(这是巨大的)。我正在尝试压缩元素(使用GZip到Base64)然而,我甚至无法做到这一点,因为xmlReader.ReadOuterXml会引发OutOfMemory异常。

我尝试了各种方法,包括使用XmlDocument.InnerXml / .OuterXml)和XDocumentXElements.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;
}

0 个答案:

没有答案