奇怪的错误:“输入流不是有效的二进制格式”

时间:2015-04-15 13:21:48

标签: c# serialization deserialization

我有以下代码来序列化和反序列化数据:

    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;
    }

1 个答案:

答案 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
}