将复杂对象集合连续序列化为文件

时间:2012-02-15 09:36:38

标签: .net xml-serialization

我正在处理一个记录compplex系统状态的应用程序。 我将这些状态记录到xml文件中(使用xml序列化)。 该文件用于重放录制的事件并进行分析。

上下文:

我的应用程序显示一组复杂数据(我们将其称为VIEW) 每个视图包含1个对象和2个对象集合(400个项目,每个项目有大约20个属性)。

应用程序以固定间隔记录数据状态(2记录之间的时间可能从5秒到60分钟不等),所有记录都存储在VIEWS集合中,我们将此VIEW集合保存到跟踪文件中(使用xmlserializer并将我的对象集序列化为文本编写器

一切正常,但是当文件达到大约20 Mo时,文件保存可能比2记录事件(文件存储在网络上,有时我们有滞后)之间的时间花费更多的时间,我们想要优化它。 / p>

所以我的问题是:

有没有办法将对象附加到文件而无需加载和编写整个文件或优化序列化到文件的方法?

我们必须使用xml序列化,因为该文件必须是人类可读的。通过代码(反序列化)。

1 个答案:

答案 0 :(得分:0)

使用数据库怎么样?这些东西是为了解决这些问题:)如果你想手动完成,你必须声明自己的协议。一个原始的工作实现:

[Serializable]
public class Test
{
    public string Name { get; set; }
}

private static string Serialize(Test instance)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Test));
    using (MemoryStream stream = new MemoryStream())
    {
        serializer.Serialize(stream, instance);
        return Convert.ToBase64String(stream.ToArray());
    }
}
private static Test Deserialize(string instance)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Test));
    byte[] instanceBytes = Convert.FromBase64String(instance);

    using (MemoryStream stream = new MemoryStream(instanceBytes))
    {
        return serializer.Deserialize(stream) as Test;
    }
}



public static void Main(string[] args)
{
    using (MemoryStream stream = new MemoryStream())
    {
        // write some test objects
        StreamWriter writer = new StreamWriter(stream);
        writer.WriteLine(Serialize(new Test() { Name = "test1" }));
        writer.WriteLine(Serialize(new Test() { Name = "test2" }));
        writer.WriteLine(Serialize(new Test() { Name = "test3" }));
        writer.Flush();

        // reset
        stream.Position = 0;

        // read them back again
        StreamReader reader = new StreamReader(stream);
        Test test1 = Deserialize(reader.ReadLine());
        Test test2 = Deserialize(reader.ReadLine());
        Test test3 = Deserialize(reader.ReadLine());
    }
}