【问题标题】:Converting tree view to byte[], then back again将树视图转换为 byte[],然后再返回
【发布时间】:2016-04-01 09:25:49
【问题描述】:

我试图将树视图转换为字节数组,然后再返回。到目前为止,当表单加载时,它将加载我的文档结构。然后据我所知,它会将其转换为字节数组并返回,但我不确定如何将字节数组转换回树视图。这是我的代码

namespace tree_view
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        string filepath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        ListDirectory(treeView1, filepath);
    }

    private static void ListDirectory(TreeView treeView, string path)
    {
        treeView.Nodes.Clear();

        var stack = new Stack<TreeNode>();
        var rootDirectory = new DirectoryInfo(path);
        var node = new TreeNode(rootDirectory.Name) { Tag = rootDirectory };
        stack.Push(node);

        while (stack.Count > 0)
        {
            var currentNode = stack.Pop();
            var directoryInfo = (DirectoryInfo)currentNode.Tag;
            foreach (var directory in directoryInfo.GetDirectories())
            {
                var childDirectoryNode = new TreeNode(directory.Name) { Tag = directory };
                currentNode.Nodes.Add(childDirectoryNode);
                stack.Push(childDirectoryNode);
            }
            foreach (var file in directoryInfo.GetFiles())
                currentNode.Nodes.Add(new TreeNode(file.Name));
        }

        treeView.Nodes.Add(node);
    }

    private Byte[] SerilizeQueryFilters()
    {
        BinaryFormatter bf = new BinaryFormatter();
        TreeNodeCollection tnc = treeView1.Nodes;

        List<TreeNode> list = new List<TreeNode>();
        list.Add(treeView1.Nodes[0]);

        using (MemoryStream ms = new MemoryStream())
        {
            bf.Serialize(ms, list);
            return ms.GetBuffer();
        }
    }

    private void DeSerilizeQueryFilters(byte[] items)
    {
        BinaryFormatter bf = new BinaryFormatter();
        List<TreeNode> _list = new List<TreeNode>();

        try
        {
            using (MemoryStream ms = new MemoryStream())
            {
                ms.Write(items, 0, items.Length);
                ms.Position = 0;
                _list = bf.Deserialize(ms) as List<TreeNode>;
                treeView2 = _list;
            }
        }
        catch { }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        byte[] data = SerilizeQueryFilters();
        DeSerilizeQueryFilters(data);
    }
}

所以目前给我的错误是“treeView2 = _list;”因为我“无法将类型 System.collections.generic.List 隐式转换为 System.Windows.Forms.TreeView”。有人有什么想法吗?

【问题讨论】:

  • “我试图将树视图转换为字节数组,然后再转换回来” - 这称为序列化。二进制序列化是最糟糕的选择,你不能用它来直接序列化复杂控制的状态,比如TreeView。考虑:1)使用另一个序列化(XmlSerializer,json)2)保存状态 - 将数据转换为某些东西(例如TreeView.Nodes - >分层List&lt;Item&gt;)并将其序列化,以恢复 - 首先读取一些东西,然后添加一个项目一个。
  • TreeNode 这样的所有可视化内容对于任何持久性都不是一个好的选择,就像BinaryFormatter 不是使用序列化/反序列化实现持久性的好选择。最好有自己的 DTO/模型类,可以通过任何提供可移植格式(XML、JSON 等)的 API 轻松序列化/反序列化。
  • 我可能应该说我不是一个优秀的程序员,我真的不明白刚才所说的任何内容哈哈,我没有编写代码,但这是我能找到的唯一代码。我不是在寻找 100% 有效、完全证明的方法,如果你有的话,只是现在可以使用的方法
  • 我也知道你说二进制是最糟糕的,但最终它会通过 tcp 发送,所以我认为它必须是

标签: c# serialization treeview binary-serialization


【解决方案1】:

在您的 DeSerilizeQueryFilters() 方法中,您应该能够在 TreeView 的 Nodes 集合上调用 .AddRange() 并添加列表中的所有节点。

_list = bf.Deserialize(ms) as List<TreeNode>;
treeView2.Nodes.AddRange(_list.ToArray()); //The parameter needs to be an array.

编辑:

此外,在您的 SerilizeQueryFilters() 方法中,您目前仅将第一个 TreeNode 添加到您的列表中。要添加所有节点,只需替换:

list.Add(treeView1.Nodes[0]);

与:

foreach(TreeNode node in treeView1.Nodes)
{
    list.Add(node);
}

【讨论】:

    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2011-04-24
    • 2013-02-18
    • 1970-01-01
    • 2013-11-15
    • 2017-01-02
    相关资源
    最近更新 更多