.net 中的流式 XML 序列化

Luc*_*tti 3 .net c# xml streaming serialization

我正在尝试IEnumerable<MyObject>使用 an序列化一个非常大XmlSerializer的对象,而不将所有对象保留在内存中。

IEnumerable<MyObject>实际上是懒..

我正在寻找一种流媒体解决方案,它将:

  1. IEnumerable<MyObject> 使用标准序列化将对象从序列化到底层流(我不想在这里手工制作 XML!
  2. 丢弃内存数据并移动到下一个

我正在尝试使用此代码:

using (var writer = new StreamWriter(filePath))
{
 var xmlSerializer = new XmlSerializer(typeof(MyObject));
  foreach (var myObject in myObjectsIEnumerable)
  {
   xmlSerializer.Serialize(writer, myObject);
  }
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了多个 XML 标头,而且我无法指定根标记,<MyObjects>因此我的 XML 无效。

任何的想法?

谢谢

Dou*_*rch 5

XmlWriter班是XML生成一个快速流API。这是相当低级的,MSDN 有一篇关于使用XmlWriter.Create().

编辑:链接已修复。这是文章中的示例代码:

async Task TestWriter(Stream stream) 
{
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Async = true;

    using (XmlWriter writer = XmlWriter.Create(stream, settings)) {
        await writer.WriteStartElementAsync("pf", "root", "http://ns");
        await writer.WriteStartElementAsync(null, "sub", null);
        await writer.WriteAttributeStringAsync(null, "att", null, "val");
        await writer.WriteStringAsync("text");
        await writer.WriteEndElementAsync();
        await writer.WriteCommentAsync("cValue");
        await writer.WriteCDataAsync("cdata value");
        await writer.WriteEndElementAsync();
        await writer.FlushAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)