2016-01-06 36 views
0

我正在使用二進制格式化程序來保存/加載文件中的數據。我有一個圖書館系統,有兩個具體類 - UsersItems - 和一個abstract類 - 圖書館。我也在使用兩個列表:反序列化 - 從文件加載數據

List<Item> items = new List<Item>(); 
List<User> users = new List<User>(); 


public static void Serialize(object value, string path) 
    { 
     BinaryFormatter formatter = new BinaryFormatter(); 

     using (Stream fStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None)) 
     { 
      formatter.Serialize(fStream, value); 
     } 
    } 

    public static object Deserialize(string path) 
    { 
     if (!System.IO.File.Exists(path)) { throw new NotImplementedException(); } 

     BinaryFormatter formatter = new BinaryFormatter(); 

     using (Stream fStream = File.OpenRead(path)) 
     { 
      return formatter.Deserialize(fStream); 
     } 
    } 
} 

以上是我用來保存和加載的兩種方法。

從程序文件給他們打電話,我使用這段代碼保存:

string pathItem1 = @"itemList"; 
string pathUser1 = @"userList"; 
Library.Serialize(Library.myItems, pathItem1); 
Library.Serialize(Library.myUsers, pathUser1); 
Console.WriteLine("Serializing..."); 

這個代碼加載:

string pathItem = @"itemList"; 
string pathUser = @"userList"; 
//var deserializedItem 
List<Item> items= (List<Item>)Library.Deserialize(pathItem); 
//var deserializedUser = 
List<User> users = (List<User>)Library.Deserialize(pathUser); 
Console.WriteLine("Deserializing..."); 

儲蓄似乎很好地工作。然而,加載不是。我收到此錯誤消息:

其他信息:無法轉換'System.Collections.Generic.List 1[LibrarySystem.User]' to type 'System.Collections.Generic.List 1 [LibrarySystem.Item]'類型的對象。

謝謝!

回答

0

您的Serialize方法中有一個奇怪的代碼。您正在將value參數保存到「itemList」和「userList」。而實際上你並沒有使用路徑參數。您的代碼應如下所示:

public static void Serialize(object value, string path) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 

    using (Stream fStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     formatter.Serialize(fStream, value); 
    } 
} 

使用此實現,您的代碼將按預期工作。

+0

該代碼現在工作沒有任何錯誤。但是,加載時,保存後實際上從文件加載的nothings! –

+0

這很奇怪,因爲我用簡單的例子和​​集合檢查了這個代碼(我用1和2個元素進行了檢查)實際上是反序列化的。 –

+0

您可以在調用Serialize方法後檢查存在的文件,並檢查文件內容(如果文件不爲空/ 0bytes,那就足夠了)。然後,您可以逐行調試代碼,以確保您的文件可以在Deserialize方法中訪問。 另外,如果您要從'Library.myUsers'保存數據,您可能想要將其加載到相同的變量?然後,使用'Library.myUsers =(列表)庫。反序列化(pathUser);' –

0
public static void Serialize(object value, string path) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 

    using (Stream fStream = new FileStream(@"itemList", FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     formatter.Serialize(fStream, value); 
    } 

    using (Stream fStream = new FileStream(@"userList", FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     formatter.Serialize(fStream, value); 
    } 
} 

你存儲在這兩個userListitemListvalue,儘管傳遞的路徑作爲參數。並且由於最後的呼叫是Library.Serialize(Library.myUsers, pathUser1)itemList中的內容是User對象的列表 - 正是錯誤告訴你的內容。

修復很明顯,只需使用傳遞的路徑,但是您應該考慮更強大的狀態存儲系統。例如,你可以有一個包含兩個列表的類,並將其序列化。

而且跳過了幾個比較明顯的改善(Deserialize是一個通用功能的總理候選人,所以你不必例如每次投它),一個重要的注意事項就是NotImplementedException是不是模糊的,你可以固定自己的意思,它在.Net框架的上下文中具有非常精確的含義,並且這是代碼中的一個功能,因爲各種原因您沒有實現該功能。您需要的「通用」例外是ArgumentExceptionInvalidOperationException

+0

我將代碼更改爲@vadim martynov告訴我的方式。該代碼現在工作沒有任何錯誤。但是,加載時,保存後實際上從文件加載的nothings! - 還將NotImplementedException更改爲ArgumentException。 –