Как обновить файл сериализованного бина без стирания данных, которые уже сохранены? - PullRequest
0 голосов
/ 29 марта 2019

Я хочу запустить программу, которая сохраняет объект путем сериализации его в файл bin. Проблема в том, что когда я сериализую один объект в новый файл, я не могу добавить в тот же файл тот же объект, не удалив его. Есть ли способ сериализации объектов одного и того же типа один за другим, а затем десериализации списка объектов?

это сохранение объекта:

static void Main(string[] args)
{
    UserHandler.saveUser("or kandabi", "2133", "board 1");
    UserHandler.saveUser("dana waizer", "21343", "board 2");
    UserHandler.saveUser("elad", "4353", "board 3");
}

это методы сохранения объекта

public static void saveUser(String userName,String password,String boardId)
{
    DalUser u = new DalUser(userName, password, boardId);
    if (!File.Exists("userData.bin"))
    {
        Stream myFileStream = File.Create("userData.bin");
        BinaryFormatter serializes = new BinaryFormatter();
        serializes.Serialize(myFileStream, u);
        myFileStream.Close();
    }
    else
    {
        Stream myFileStream = File.OpenRead("userData.bin");
        BinaryFormatter serializes = new BinaryFormatter();
        serializes.Serialize(myFileStream, u);
        myFileStream.Close();
    }
}

Я ожидал, что данные будут сохранены в том же файле "userData.bin", но было исключение, что поток не может быть открыт для записи.

1 Ответ

0 голосов
/ 29 марта 2019

Используйте FileStream и FileMode.Append.Затем вы можете добавить любой объект в ваш файл, а затем вы можете прочитать их в виде списка.Измените свой код на следующий:

public static void saveUser(String userName, String password, String boardId)
{
    DalUser u = new DalUser(userName, password, boardId);
    using (var fileStream = new FileStream("userData.bin", FileMode.Append))
    {
        var bFormatter = new BinaryFormatter();
        bFormatter.Serialize(fileStream, u);
    }
}

public static List<DalUser> readUsers()
{
    if (!File.Exists("userData.bin"))
        return null;
    var list = new List<DalUser>();
    using (var fileStream = new FileStream("userData.bin", FileMode.Open))
    {
        var bFormatter = new BinaryFormatter();
        while (fileStream.Position != fileStream.Length)
        {
            list.Add((DalUser)bFormatter.Deserialize(fileStream));
        }
    }
    return list;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...