【发布时间】: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<Item>)并将其序列化,以恢复 - 首先读取一些东西,然后添加一个项目一个。 -
像
TreeNode这样的所有可视化内容对于任何持久性都不是一个好的选择,就像BinaryFormatter不是使用序列化/反序列化实现持久性的好选择。最好有自己的 DTO/模型类,可以通过任何提供可移植格式(XML、JSON 等)的 API 轻松序列化/反序列化。 -
我可能应该说我不是一个优秀的程序员,我真的不明白刚才所说的任何内容哈哈,我没有编写代码,但这是我能找到的唯一代码。我不是在寻找 100% 有效、完全证明的方法,如果你有的话,只是现在可以使用的方法
-
我也知道你说二进制是最糟糕的,但最终它会通过 tcp 发送,所以我认为它必须是
标签: c# serialization treeview binary-serialization