如何更新序列化的bin文件而不删除已保存的数据?

问题描述 投票:0回答:1

我想运行一个程序,通过将对象序列化为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”文件中,但是有一个例外,即无法打开流进行写入。

c# serialization
1个回答
0
投票

使用FileStreamFileMode.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;
}
© www.soinside.com 2019 - 2024. All rights reserved.