2012-02-15 24 views
1

我正在研究记录compplex系统状态的应用程序。 我必须将这些状态记录到xml文件(使用xml序列化)。 该文件用于重放记录的事件并对其进行分析。将复杂对象集合连续序列化到文件

上下文:

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

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

所有工作都很好,但是当文件达到20 Mo时,文件保存可能比2记录事件之间的时间花费更多时间(文件存储在网络上有时我们有时滞),我们希望优化它。

所以我的问题是:

有没有办法为对象追加到一个文件,而不需要加载和写入整个文件或方式来优化序列化到文件?

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

+0

您是否需要立即(或半实时地)使文件可用于序列化对象?如果没有,你可能会将序列化和文件I/O卸载到消息队列以进行并行/异步处理? – 5arx 2012-02-15 09:44:00

+0

是的,序列化的对象应该是立即可用的(在系统关闭的情况下,最后一个知道状态必须在跟踪文件中可用) – Webmixer 2012-02-16 10:54:43

+0

我不确定是否意味着它需要足够强大以足够恢复/不会丢失数据,或者在系统运行时序列化对象需要用于某些其他核心功能。如果您只需确保数据在发生灾难性系统事件时不会丢失,例如有人不小心关闭系统,我会倾向于使用排队。然后,您的活动系统只需要将状态转储到MSMQ或类似的位置,并且运行在不同盒子上的序列化程序代码可以执行资源匮乏的I/O操作。 – 5arx 2012-02-16 11:16:05

回答

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

将调查此问题。但我们不能使用数据库,文件应该可以用XML /文本编辑器(记事本,xmlspy,...) – Webmixer 2012-02-16 10:57:24

+0

可读,在这种情况下,你应该创建自定义的序列化/反序列化逻辑(建议在这里使用xlinq) – Polity 2012-02-16 11:25:37