2012-02-15 75 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