2011-08-27 32 views
0

我有以下方法進行序列化的類的列表磁盤:如何最佳序列化實體在C#中的列表

private static void Serialize(List<CcmAlarmUalUsl> entityList) 
{ 
    try 
    { 
     using (Stream stream = File.Open("CcmAlarmUalUsl.dat", FileMode.Create)) 
     { 
      BinaryFormatter bin = new BinaryFormatter(); 
      bin.Serialize(stream, entityList); 
     } 
    } 
    catch (IOException) 
    { 
    } 
} 

實體類我想序列如下所示:

public class CcmAlarmUalUsl 
{ 
    public string SubId { get; set; } 

    public System.DateTime TimeOfAlarm { get; set; } 

    public int AlarmType { get; set; } 
} 

我的Serialize類是將實體列表序列化到磁盤的最佳方式嗎?這並不需要人類可讀。它將被應用程序嚴格使用,作爲內部緩存的存儲手段。沒有數據庫存儲是必要的。

我也有點擔心什麼時候修改CcmAlarmUalUsl的結構。我可以添加屬性到類的最後。這將如何影響現有的緩存項目?

+0

什麼是'lizards1'?你是否認爲這是'entityList'? –

+0

您對序列化數據的要求是什麼?如果你的要求是序列化的數據是人類可讀的,那麼沒有BinaryFormatter不是最好的解決方案,XmlSerializer可能是一個更好的選擇。你的代碼也不是很清楚,你序列化了一個名爲'lizards1'的變量,但函數接受了enityList,它是你想要序列化的entityList? –

+0

對不起 - lizards1是一個錯字。 – Hosea146

回答

1

簡單的答案 - 沒有。您的代碼不會編譯(lizards1 ??),並且您的CcmAlarmUalUs1類未標記爲可序列化(運行時錯誤)。將你的CcmAlarmUrlUs1類標記爲可串行化,將lizards1更改爲entityList,它應該可以正常工作,看起來你正在做的事情很好。

雖然你的問題有點模糊。 '最好',你在找什麼?如果不知道,真的很難給出一個好的答案。

+0

謝謝。 'Lizards1'是一個錯字。這並不需要人類可讀。它嚴格地作爲應用程序存儲機制來存儲緩存的項目列表。這並不需要持久保存在數據庫中。我已更新我的帖子以包含其他要求。 – Hosea146

2

最好的方法,取決於您的應用需求。 二進制序列化(標準版)在硬盤上使用的內存通常很便宜,但不是非常具有可擴展性,因爲有一次您重構代碼,您將面臨反序列化先前保存的二進制文件的問題。哪個可以解決,但我個人不喜歡這種方法,儘量避免它。

考慮:

  1. XML序列化
  2. JSON序列
  3. 保存對象的SQLite數據庫與一些輕量級ORM。
  4. 定製二進制序列化...

還有很多其他類型的存在,但是這些的恕我直言,在這些日子裏更加化解的。

希望這會有所幫助。

+0

我同意並補充說Json序列化創建的數據比XML序列化要小 –