2016-01-06 4 views
0

Я использую Binary Formatter для сохранения/загрузки данных из файла. У меня есть библиотечная система с двумя конкретными классами - Users и Items - и класс abstract - Библиотека. Я также использую два списка:Deserialize - Загрузка данных из файла

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..."); 

Saving, кажется, работает хорошо. Загрузка, однако, нет. Я получаю сообщение об ошибке:

Дополнительная информация: Не удается привести объект типа 'System.Collections.Generic.List 1[LibrarySystem.User]' to type 'System.Collections.Generic.List 1 [LibrarySystem.Item].

Спасибо!

ответ

0

У вас есть странный код в вашем методе Serialize. Вы сохраняете параметр value для обеих сторон: «itemList» и «userList». И на самом деле вы не используете параметр path. Ваш код должен выглядеть так:

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

Код теперь без ошибок. Однако при загрузке ничего не загружается из файла после сохранения! –

+0

Странно, потому что я проверил этот код с помощью простого примера и коллекции (я проверил его с 1 и 2 элементами) фактически десериализован. –

+0

Вы можете проверить файл, существующий после вызова метода Serialize, а также проверить содержимое файла (этого достаточно, если файл не пуст/0 байтов). Затем вы можете отлаживать код по строкам, чтобы убедиться, что ваш файл доступен в методе Deserialize. Кроме того, если вы сохраняете данные из 'Library.myUsers', возможно, хотите загрузить их в одну и ту же переменную? Затем используйте библиотеку LibraryMyUsers = (Список ).Deserialize (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); 
    } 
} 

Вы хранения value в обоих userList и itemList, несмотря на прохождение пути в качестве параметра. И так как последний звонок Library.Serialize(Library.myUsers, pathUser1), то, что находится в itemList, является списком User объектов - именно то, что говорит вам об ошибке.

Исправление очевидно, просто используйте пройденный путь, однако вы должны рассмотреть более надежную систему хранения состояния. Например, у вас может быть класс, содержащий оба списка, и вы его сериализуете.

И пропуская несколько относительно очевидных улучшений (Deserialize является основным кандидатом на общую функцию, поэтому вам не нужно бросать его каждый раз, например), важно одно: NotImplementedException не является чем-то неопределенным придерживайтесь своего значения, он имеет очень точное значение в контексте .Net framework, и это функция в вашем коде, которую вы не реализовали по разным причинам. Вы хотите получить «общее» исключение: ArgumentException или InvalidOperationException.

+0

Я изменил код до того, как сказал мне вадим Мартынов. Код теперь работал без ошибок. Однако при загрузке ничего не загружается из файла после сохранения! - Также изменено исключение NotImplementedException в ArgumentException. –

Смежные вопросы