在学过了C#序列化的基础知识后,我果断把他用到我正在写的一个地址簿软件中。
在我地址簿里有一个treeview,我的设计是两层的,最外层是两个根节点,然后各根节点下面可以创建一级子节点。
刚开始的时候我在网上看到一些高人把正棵树都序列了,就是达到了通用性——代码对于任何树都可以实现序列化。代码有点多,需要有点耐心才能啃下来。(我耐心不是很好 T_T )所以我决定就针对我自己这个简单的树结构自己写个针对某个节点的下的所有一级节点进行序列。
就相当于我只要对我自己两个根节点下的子节点序列就可以了,于是我写了一个TreeNodes类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; //这里我直接调用了窗体控件空间,这样我就可以使用系统TreeNode类了,哈哈
namespace treeview
{
[Serializable]
class TreeNodes
{
private TreeNode[] tn; //这里我就声明了系统的TreeNode类的数组,把那某个节点下的一级节点都保存进去
public TreeNodes(TreeNode treenode) //构造函数就是把一级节点保存到数组里了呢
{
tn = new TreeNode[treenode.Nodes.Count];
for (int i = 0; i < treenode.Nodes.Count; i++)
{
tn[i] = treenode.Nodes[i];
}
}
public void setTreeNodes(TreeNode treenode) //这个函数就是把数组里节点加到某个节点下,反序列时候用的
{
for (int i = 0; i < tn.Length; i++)
{
treenode.Nodes.Add(tn[i]);
}
}
}
}
//这个类是不是很简单。
序列化:(把子节点存到类里就可以序列化了)
try
{
TreeNodes tns = new TreeNodes(this.treeView1.Nodes[0]);
FileStream fs = new FileStream("root.bin", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, tns);
fs.Close();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
反序列化:
try
{
if (File.Exists("root.bin"))
{
FileStream fs = new FileStream("root.bin", FileMode.Open, FileAccess.Read);
BinaryFormatter bf = new BinaryFormatter();
TreeNodes tns0 = (TreeNodes)bf.Deserialize(fs);
tns0.setTreeNodes(this.treeView1.Nodes[0]);
fs.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}