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