使用System.Xml.Serialization在文件中重用以前的序列化

时间:2013-07-16 19:21:59

标签: c# .net xml serialization file-io

我有一个需要不断序列化的类,因为信息是从我的应用程序之外的文件中读取的。我的信息类可以用这样的代码表示:

[XmlRoot("log")]
public class Log
{
    [XmlArray("infos")]
    [XmlArrayItem("info")]
    public List<Item> Infos { get; set; }
}

public class Item
{
    [XmlElement("time")]
    public DateTime Time { get; set; }

    [XmlElement("info")]
    public string Info { get; set; }
}

我的问题是,每次添加新元素时都必须编写完整文件,这会产生不必要的性能。像这样:

var serializer = new XmlSerializer(typeof(Log));

stream.SetLength(0);

serializer.Serialize(stream, log);

我在写作之前尝试删除了清理过程,但对性能没有任何影响。有没有人有提高性能的想法?

EDITED

此集合中的元素数量超过100,000个。

2 个答案:

答案 0 :(得分:1)

流式传输到CSV或纯文本文件以获取日志将是比XML更好的解决方案,因为您可以简单地将日志项追加到它。

如果必须使用XML,则至少需要重写从当前位置到文件末尾的所有内容。使用streamreader和streamwriter将文件复制到您想要插入的位置,写入新数据,然后写入文件的其余部分。仍然会有IO瓶颈,这种方法唯一可以获得的就是不会在每次写入时序列化每个对象。

非常类似于:In C#, is there a way to add an XML node to a file on disk WITHOUT loading it first?

答案 1 :(得分:0)

我认为,您可以使用链接XmlReader/XmlWriter来提高效果。 试着看看这篇文章http://msdn.microsoft.com/en-us/library/aa302289.aspx