2013-05-07 103 views
5

我正在創建一個錯誤日誌庫,它在指定的位置創建一個文件,然後將錯誤信息保存在該文件中,然後可以通過我打算聯合編寫的單獨的任務程序讀取該錯誤信息與這個圖書館。序列化和反序列化多個對象

說,我已把它的方式是二進制格式(使用BinaryFormatter()FileStream()),其中序列化一個名爲ErrorEntry類到文件,並將其附加到文件末尾。這意味着我有一系列ErrorEntries緊接着。我沒有將它作爲列表,因爲從文件中讀取所有信息到列表中,添加條目,然後將其保存迴文件並轉儲資源似乎並不實際。只需要執行單個寫入命令,並將每個命令存儲爲自己的序列化對象似乎更加有效。

我的問題是,我可以找到幾個序列化列表或單個對象的例子,但沒有多個 - 但單獨的對象。雖然我想將它們保存爲單個對象,但在加載它們時,我想讀取對象並將該系列作爲該對象的列表返回。我想有類似的東西

while(!EOF) 
{ 
    //deserialize each object 
    //add individual object to a list 
} 
//return the list of objects 

我該如何去反序列化每個對象從單個文件?它是否具有上述工作的內部標記,我只需檢測它是否是文件的結尾,還是需要做其他操作才能讀取它們?

+0

你爲什麼不乾脆把所有的物體放到'名單'和序列化數據結構?您將防止許多角落案例,例如被認爲是「獨立」的對象之間的相互依賴關係。 – 2013-05-07 10:19:13

+0

@OndrejTucny他想追加到文件中而不加載所有以前的條目。 – weston 2013-05-07 10:22:18

+0

他說爲什麼它看起來合理。要在對象級別反序列化,您必須在每次輸入後編寫分隔符序列,並在讀取文件時對其作出反應。 – Tommi 2013-05-07 10:22:50

回答

6

使用FileStream fs;您可以使用fs.Position!=fs.Length來檢測EOF。

當附加時,使用FileMode.Appendfs.Seek(0, SeekOrigin.End);在寫入新條目之前結束。

反序列化全:

public static ICollection<T> DeserializeList<T>(FileStream fs) 
{ 
    BinaryFormatter bf = new BinaryFormatter(); 
    List<T> list = new List<T>(); 
    while(fs.Position!=fs.Length) 
    { 
     //deserialize each object in the file 
     var deserialized = (T)bf.Deserialize(fs); 
     //add individual object to a list 
     list.Add(deserialized); 
    } 
    //return the list of objects 
    return list; 
} 
+1

如何從該文件反序列化對象?事實上,您可以使用附加序列化許多對象到文件並不保證您將能夠將它們反序列化。 – Artemix 2013-05-07 10:30:00

+0

@Artemix見編輯。基於他的代碼。那有什麼不對嗎? – weston 2013-05-07 10:37:16

+0

不會只是使用filemode.append然後寫作業?或者我必須說filemode.append和fs.seek? – 2013-05-07 10:49:20