【问题标题】:BinaryFormatter: SerializationExceptionBinaryFormatter:序列化异常
【发布时间】:2013-07-19 18:29:57
【问题描述】:

我正在使用 BinaryFormatter 加载和保存我的 treeView。如果目标文件不存在,我想防止错误。我的代码:

        public static void Load(TreeView tree, string filename)
    {
        if (!File.Exists(filename))
        {
            Stream file = File.Create(filename);
            return;
        }
        else
        {

            using (Stream file = File.Open(filename, FileMode.Open))
            {
                BinaryFormatter bf = new BinaryFormatter();
                object obj = bf.Deserialize(file);

                TreeNode[] nodeList = (obj as IEnumerable<TreeNode>).ToArray();
                tree.Nodes.AddRange(nodeList);
            }
        }
    }

如果我要手动删除文件,它应该创建新文件,名称与前一个相同。问题是当它到达object obj = bf.Deserialize(file); 时,会出现错误Attempting to deserialize an empty stream.。我的猜测是新文件缺少一些二进制结构或其他东西,但我仍然不确定如何解决它。 如果我稍后尝试将节点添加到 treeView 并保存它,我会收到错误,即文件被其他程序使用。

【问题讨论】:

    标签: c# visual-studio-2010 serialization binaryformatter


    【解决方案1】:
    public static void Load(TreeView tree, string filename)
    {
        using (var file = File.Open(filename, FileMode.OpenOrCreate))
        {
            if (file.Length.Equals(0))
                return;
    
            var bf = new BinaryFormatter();
            var obj = bf.Deserialize(file);
            var nodeList = (obj as IEnumerable<TreeNode>).ToArray();
            tree.Nodes.AddRange(nodeList);
        }
    
    }
    

    【讨论】:

    • 谢谢,很有魅力。如果将来有人在寻找答案,我还要写一件事:创建新文件后,您必须关闭它,否则在重新启动应用程序之前您将无法加载它。只需添加“file.Close();”在“返回;”之前。
    • using() {} 块执行Close()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    相关资源
    最近更新 更多