我有以下代码来序列化和反序列化数据:
static public void Serialize(List<Access> accesos, Stream stream)
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, accesos);
}
static public List<Access> Deserialize(Stream stream)
{
try
{
IFormatter formatter = new BinaryFormatter();
List<Access> data = formatter.Deserialize(stream) as List<Access>;
return data;
}
catch
{
return null;
}
}
问题是,当我将List<>
序列化为文件并立即尝试反序列化时,错误
“输入流不是有效的二进制格式”
在formatter.Deserialize(stream)
行中抛出。
在序列化时,正在打开流:
Stream stream = File.Open(GetConfigurationFilePath(), FileMode.Create);
在deserializarion上,正在打开流:
Stream stream = File.Open(GetConfigurationFilePath(), FileMode.Open);
这里可能会发生什么?二进制格式不会以任何方式改变。
编辑:这就是我调用两种静态方法的方法:
using (Stream stream = File.Open(GetConfigurationFilePath(), FileMode.Create))
{
this.Accesos = frm.Accesos;
Serializer.Serialize(this.Accesos, stream);
stream.Close();
}
using (Stream stream = File.Open(GetConfigurationFilePath(), FileMode.Open))
{
this.Accesos = Serializer.Deserialize(stream);
stream.Close();
}
private string GetConfigurationFilePath()
{
string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
if (path.Last() != '\\')
path += '\\';
path += CONFIG_FILE;
return path;
}
答案 0 :(得分:3)
当我将
List<Access>
序列化为文件时,立即尝试反序列化...
此处最可能的问题是,在您开始反序列化文件内容时,程序尚未完成写入流。格式化程序确实完成了它的工作,但部分数据保持缓冲在内存中。这可能是因为您的代码没有明确地或通过处理流来关闭文件流。
在您的流周围添加using
可以解决问题:
using (Stream stream = File.Open(GetConfigurationFilePath(), FileMode.Create)) {
... // Serialization code
}
using (Stream stream = File.Open(GetConfigurationFilePath(), FileMode.Open)) {
... // Deserialization code
}