сериализация С# BinaryFormatter

274
18 апреля 2017, 06:24

Столкнулся с такой проблемой. Есть класс User. В нем есть метод SaveUser, который записывает в файл только 1 запись. Есть метод LoadUsers, который возвращается список всех записанных в файл пользователей. Ошибка происходит в строчке с комментарием. Он не может конвертировать User в User[]. Как решить эту проблему без переписывания метода SaveUser?

class User 
{      
    private string name;
    private string password;
    private string key;
    private static string fileName = @"Data\users.dat";
public void SaveUser()
    {
        BinaryFormatter formatter = new BinaryFormatter();
        // получаем поток, куда будем записывать сериализованный объект
        using (FileStream fs = new FileStream(fileName, FileMode.Append))
        {
            formatter.Serialize(fs, this);
        }
    }
 public static List<User> LoadUsers()
    {
        List<User> listUser = new List<User>();
        BinaryFormatter formatter = new BinaryFormatter();
        //десериализация из файла people.dat
        using (FileStream fs = new FileStream(fileName, FileMode.Open))
        {
            if (fs == null)
                return listUser;
            else
            {
                User[] deserilizeUsers = (User[])formatter.Deserialize(fs);// ошибка, нельзя преобразовать User в User[]
                foreach (User user in deserilizeUsers)
                {
                    listUser.Add(user);
                }
            }
         }
         return listUser;
     }
}
Answer 1

Как уже сказано в комментарии, десериализовать записи нужно по одной, в цикле. Примерно, так:

List<User> listUser = new List<User>();
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
    while (fs.Position < fs.Length)
    {
        var user = (User)formatter.Deserialize(fs);
        listUser.Add(user);
    }
}
return listUser;

Конечно, нужно добавить обработку исключений.

READ ALSO
Картинка перекрывает текст itextSharp

Картинка перекрывает текст itextSharp

Работаю в WinForms и iTextSharpСоздаю новый документ PDF ставлю на фон jpg изображение

305
Обработка исключений в Visual Studio Community (2015)

Обработка исключений в Visual Studio Community (2015)

В определенный момент visual studio перестал при запуске C# проекта (WinForms) выдавать уведомления, указывающие, какая именно операция сгенерировала...

266
C# TabPage не отрисовывается изображение

C# TabPage не отрисовывается изображение

В конструкторе формы добавил ImageList и в него добавил изображениеНа вкладке выбрал изображение в ImageIndex

263
Свойства предмета в unity3d

Свойства предмета в unity3d

Создаю виртуальный музей на unityКогда игрок подходит к экспонату и нажимает на Е, должно появиться подробное описание и камера 360

312