我正在通过写一个家庭图书馆经理来学习C#.
我有一个BookController,它将书籍存储在数据结构中并对它们执行操作.
C#是否有办法将字典中的数据保存到本地文件(可能是XML格式)以便稍后加载,或者我是否必须自己编写?
保存和加载C#可用数据的最佳方法是什么?只需指出一个好的方向.
在过去2天搜索到这个问题的答案后,我希望有人可以提供帮助.
我使用VS2012在c#中编写了一个程序,它使用BinaryFormatter保存用户的项目数据,将序列化类序列化为Stream,然后将其保存到文件中.该程序已经使用了一段时间,但是最近用户无法打开他前一天保存的文件.他把文件发给我了,我在degugger中得到的错误是:
"二进制流'0'不包含有效的BinaryHeader.可能的原因是序列化和反序列化之间无效的流或对象版本更改."
鉴于用户在前一天保存了数据,序列化和反序列化之间的基础对象结构或格式没有变化.
之前没有出现过这个问题,导致我认为它必须是非常间歇性的,因此序列化和反序列化的对象没有明显的问题.
我的问题是:
我对这个错误的理解是序列化数据的格式与被反序列化的对象的格式不匹配.它是否正确?还有其他原因吗?
如果是这样,可能导致这种间歇性错误的原因是什么?
有没有办法从这个文件中检索数据,即使BinaryFormatter不认为它的格式正确?
有更安全的方法来保存和加载数据吗?我已经看到XmlFormatter似乎是一个更好的选择,但是这将如何帮助确保保存和调用的数据的完整性?
如果有帮助,我用来序列化/反序列化的代码如下:
//serialize
SEProjectData serializedProject = serializeProjectData();
Stream stream = File.Open(saveFileDialog1.FileName, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, serializedProject);
stream.Close();
//deserialize
Stream stream = File.Open(path, FileMode.Open);
BinaryFormatter bFormatter = new BinaryFormatter();
stream.Seek(0, SeekOrigin.Begin);
SEProjectData projectData = (SEProjectData)bFormatter.Deserialize(stream);
stream.Close();
Run Code Online (Sandbox Code Playgroud)