通过BinaryFormatter反序列化MemoryStream

时间:2013-12-07 14:43:11

标签: c# treeview deserialization memorystream binaryformatter

没有找到解决以下问题的方法 我有一个工作代码用于在文件中保存/加载TreeView但我想将它保存到Properties.Settings.Default。

不幸的是,我在这行中收到错误“没有对象的地图”:

object obj = bf.Deserialize(ms);

以下是(反)序列化的完整代码:
不知道如何解决这个问题。 :(

public static void SaveTreeView(TreeView tree)
{
    using (MemoryStream ms = new MemoryStream())
    {
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, tree.Nodes.Cast<TreeNode>().ToList());
        ms.Position = 0;
        var sr = new StreamReader(ms);
        Properties.Settings.Default.tree = sr.ReadToEnd();
        Properties.Settings.Default.Save();
    }
}

public static void LoadTreeView(TreeView tree)
{

    using (MemoryStream ms = new MemoryStream())
    {
        var sw = new StreamWriter(ms);
        sw.WriteLine(Properties.Settings.Default.tree);
        sw.Flush();
        ms.Seek(0, SeekOrigin.Begin);

        BinaryFormatter bf = new BinaryFormatter();
        object obj = bf.Deserialize(ms);

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

有人有个主意吗? 谢谢你的到来。

1 个答案:

答案 0 :(得分:7)

试试这个

    public static void SaveTree(TreeView tree)
    {
        using (var ms = new MemoryStream())
        {
            new BinaryFormatter().Serialize(ms, tree.Nodes.Cast<TreeNode>().ToList());

            Properties.Settings.Default.tree = Convert.ToBase64String(ms.ToArray());
            Properties.Settings.Default.Save();
        }
    }

    public static void LoadTree(TreeView tree)
    {
        byte[] bytes = Convert.FromBase64String(Properties.Settings.Default.tree);
        using (var ms = new MemoryStream(bytes, 0, bytes.Length))
        {
            ms.Write(bytes, 0, bytes.Length);
            ms.Position = 0;
            var data =  new BinaryFormatter().Deserialize(ms);
            tree.Nodes.AddRange(((List<TreeNode>)data).ToArray());
        }
    }