我试图使用IEnumerable<MyObject>
序列化一个非常大的XmlSerializer
,而不将所有对象保存在内存中。IEnumerable<MyObject>
实际上很懒。
我正在寻找一个流媒体解决方案,它将:
从IEnumerable<MyObject>
中获取对象
使用标准序列化将它序列化到底层流(我不想在这里手工制作XML!)
丢弃内存中的数据并移到下一个
我在尝试这个代码:
using (var writer = new StreamWriter(filePath))
{
var xmlSerializer = new XmlSerializer(typeof(MyObject));
foreach (var myObject in myObjectsIEnumerable)
{
xmlSerializer.Serialize(writer, myObject);
}
}
但是我得到了多个xml头,无法指定根标记
<MyObjects>
,所以我的xml无效。有什么想法吗?
谢谢
最佳答案
XmlWriter
类是用于xml生成的快速流式api。这是相当低级的,msdn在使用XmlWriter.Create()
实例化验证xmlwriter时有一个article。
编辑:链接已修复。以下是文章中的示例代码:
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();
}
}