.net 将复杂对象集合连续序列化到文件

.net 将复杂对象集合连续序列化到文件,.net,xml-serialization,.net,Xml Serialization,我正在开发一个记录compplex系统状态的应用程序。 我必须将这些状态记录到xml文件中(使用xml序列化)。 此文件用于回放记录的事件并对其进行分析 背景: 我的应用程序显示一组复杂数据(我们称之为视图) 每个视图包含1个对象和2个对象集合(400个项目,每个项目约有20个属性) 应用程序以固定的间隔记录数据状态(两条记录之间的时间可能从5秒到60分钟不等),所有记录都存储在视图集合中,我们将此视图集合保存到跟踪文件(使用xmlserializer并将我的对象集合序列化到文本编写器) 所有这

我正在开发一个记录compplex系统状态的应用程序。 我必须将这些状态记录到xml文件中(使用xml序列化)。 此文件用于回放记录的事件并对其进行分析

背景:

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

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

所有这些都可以很好地工作,但当文件达到大约20个月时,文件保存可能需要比两次记录事件之间的时间更长的时间(文件存储在网络上,有时我们会出现延迟),我们希望对此进行优化

所以我的问题是:

有没有一种方法可以在不必加载和写入整个文件的情况下将对象附加到文件中,或者有没有一种方法可以优化对文件的序列化?


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

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

[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());
    }
}

是否需要立即(或半实时)将序列化对象提供给文件?如果没有,您也许可以将序列化和文件I/O卸载到消息队列以进行并行/异步处理?是的,序列化对象应该立即可用(如果系统关闭,跟踪文件中必须有最后知道的状态)我不确定您的意思是,它是否需要足够健壮,以便在不丢失数据的情况下正常恢复/降级,或者在系统运行时,序列化对象是否需要用于某些其他核心功能。如果您只需要确保在发生灾难性系统事件(例如,有人意外关闭系统)时不会丢失数据,我倾向于研究使用排队。然后,您的活动系统只需将状态转储到MSMQ或类似程序,而在另一个框上运行的serialiser代码就可以执行需要大量资源的I/O操作。我们将对此进行调查。但我们不能使用数据库,文件应该可以通过xml/文本编辑器(记事本、xmlspy等)读取。在这种情况下,您应该创建自定义序列化/反序列化逻辑(建议在此处使用xlinq)