oop - 当我尝试将其拉回 C# 时,数据会发生变化
问题描述
我正在尝试保存一个通用列表并使用 BinaryFormatter 将其取回,但我无法以我保存的形式获取列表,它只返回列表中的第一项。我认为代码尝试不覆盖文件时可能会出错。如果您需要更多详细信息,请告诉我,我会添加您需要的详细信息。
#region Save
/// <summary>
/// Saves the given object to the given path as a data in a generic list.
/// </summary>
protected static void Save<T>(string path, object objectToSave)
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream stream;
if (!File.Exists(path))
{
stream = File.Create(path);
}
else
{
stream = File.Open(path, FileMode.Open);
}
List<T> list = new List<T>();
try
{
list = (List<T>)formatter.Deserialize(stream);
}
catch
{
}
list.Add((T)objectToSave);
formatter.Serialize(stream, list);
stream.Close();
}
#endregion
#region Load
/// <summary>
/// Loads the data from given path and returns a list of questions.
/// </summary>
protected static List<T> Load<T>(string path)
{
if (!File.Exists(path))
{
System.Windows.Forms.MessageBox.Show(path + " yolunda bir dosya bulunamadı!");
return null;
}
BinaryFormatter formatter = new BinaryFormatter();
FileStream stream = File.Open(path, FileMode.Open);
List<T> newList;
try
{
newList = (List<T>)formatter.Deserialize(stream);
}
catch
{
newList = null;
}
stream.Close();
return newList;
}
#endregion
解决方案
好的,我刚刚发现了问题。显然,如果您在不保存数据的情况下对数据进行了更改(我在“list = (List)formatter.Deserialize(stream);”这行代码中进行了更改),然后如果您尝试再次对其进行序列化,您的 FileStrem are using 通常无法正常工作,因此您必须关闭旧流,然后再次重新打开它或仅键入 stream = File.Open(path, FileMode.Open); 再次。无论如何谢谢 :D
推荐阅读
- c++ - 如何将接口对象传递给方法?
- javascript - 选择日期时,数据选择器模块未关闭
- reactjs - 如何在反应中使用回调函数消除setState中的滞后
- string - 将字符串转换为字节并在 Lua 中写入文件
- vue.js - 在 Vue 中创建条件输入字段组件
- c# - EF Core.Tools 未被识别为 cmdlet、函数或程序的名称
- google-pay - Google Pay 如何判断用户的付款方式?
- javascript - 附加的行组作为 jquery 响应不尊重表条带表样式
- r - 使用 poly2nb() 的邻居列表适用于 2004 年人口普查 shapefile,但不适用于 2011 年
- php - 使用自定义验证扩展()时,获取方法 Illuminate\Validation\Validator::validateError 不存在