C# TreeView序列化、串行化、反序列化

原文地址

2009年給公司做了個管理系統,裏面用到了TreeView,數據有1500多條,加載要10秒鐘左右

秉着有問題,就要解決,尤其是像這種幾十人、上百人使用的系統。

後來使用登錄時加載數據,登錄後再使用就Clone()的解決方案,感覺不錯。不過,每次調試程序時得等半天,實在不爽。

前些天看到“序列化”這個概念,大意就是把對象保存爲一個文件,下次再使用時,反序列化一下就OK了,第二天一大早到公司立馬做了個Demo,哇,不錯,非常之不錯,使用此方法後,根本沒有延遲的現象。今天終於應用到這個項目中了,同志們再也不用等那10秒了。

 

以上是背景,將其上雜亂的代碼進行整理,得到整理好的對Table、TreeView序列化的類,版本1.0。

 

using System;
using System.IO;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.Data;


namespace DBFSR.HRDRW
{

    /// <summary>
    /// 對TreeView,DataTable 對象進行序列化的存儲
    /// 
    /// Usage:
    /// 反序列化:SerializeTree.TreeViewDataAccess.LoadTreeViewData(treeView1,"C:\\treeview.txt");  
    /// 序列化:  SerializeTree.TreeViewDataAccess.SaveTreeViewData(treeView1,"C:\\treeview.txt");  
    /// </summary>
    class TreeView_Serialize
    {
        public TreeView_Serialize()
        {

        }

        [Serializable()]
        public struct TreeViewData
        {
            public TreeNodeData[] Nodes;

            /// <summary>  
            /// 遞歸初始化TreeView數據  
            /// </summary>  
            /// <param name="treeview"></param>  
            public TreeViewData(TreeView treeview)
            {
                Nodes = new TreeNodeData[treeview.Nodes.Count];
                if (treeview.Nodes.Count == 0)
                {
                    return;
                }
                for (int i = 0; i <= treeview.Nodes.Count - 1; i++)
                {
                    Nodes[i] = new TreeNodeData(treeview.Nodes[i]);
                }
            }

            // <summary>
            /// 彈出TreeView
            /// </summary>
            /// <param name="tv"></param>
            public void PopupTree(TreeView tv)
            {

                if (this.Nodes == null || this.Nodes.Length == 0)
                {
                    return;
                }
                tv.BeginUpdate();
                for (int i = 0; i <= this.Nodes.Length - 1; i++)
                {
                    tv.Nodes.Add(this.Nodes[i].GetTreeNodes());
                }
                tv.EndUpdate();

            }

        }

        /// <summary>
        /// 對TreeNode數據對象進行序列化
        /// </summary>
        [Serializable()]
        public struct TreeNodeData
        {
            public string m_strText;
            public int m_nImageIndex;
            public int m_nSelectedImageIndex;

            public bool m_bChecked;
            public bool m_bExpanded;
            public object m_Tag;

            public TreeNodeData[] m_Nodes;


            /// <summary>  
            /// TreeNode構造函數  
            /// </summary>  
            /// <param name="tn">傳入初始化內容</param>  
            public TreeNodeData(TreeNode tn)
            {
                this.m_strText = tn.Text;
                this.m_nImageIndex = tn.ImageIndex;
                this.m_nSelectedImageIndex = tn.SelectedImageIndex;
                this.m_bChecked = tn.Checked;
                this.m_bExpanded = tn.IsExpanded;
                this.m_Nodes = new TreeNodeData[tn.Nodes.Count];

                if ((!(tn.Tag == null)) && tn.Tag.GetType().IsSerializable)
                    this.m_Tag = tn.Tag;
                else
                    this.m_Tag = null;

                if (tn.Nodes.Count == 0)
                    return;

                for (int i = 0; i <= tn.Nodes.Count - 1; i++)
                    m_Nodes[i] = new TreeNodeData(tn.Nodes[i]);

            }

            /// <summary>
            /// 返回TreeNode數據
            /// </summary>
            /// <returns></returns>
            public TreeNode GetTreeNodes()
            {
                TreeNode ToTreeNode = new TreeNode(this.m_strText, this.m_nImageIndex, this.m_nSelectedImageIndex);
                ToTreeNode.Checked = this.m_bChecked;
                ToTreeNode.Tag = this.m_Tag;
                if (this.m_bExpanded)
                {
                    ToTreeNode.Expand();
                }
                if (this.m_Nodes == null && this.m_Nodes.Length == 0)
                {
                    return null;
                }
                if (ToTreeNode != null && this.m_Nodes.Length == 0)
                {
                    return ToTreeNode;
                }
                for (int i = 0; i <= this.m_Nodes.Length - 1; i++)
                {
                    ToTreeNode.Nodes.Add(this.m_Nodes[i].GetTreeNodes());
                }
                return ToTreeNode;


            }
        }

        /// <summary>
        /// 加載TreeView
        /// </summary>
        /// <param name="treeView"></param>
        /// <param name="path"></param>
        public static void LoadTreeViewData(TreeView treeView, string path)
        {

            BinaryFormatter bfmter = new BinaryFormatter();
            Stream file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
            TreeViewData treeData = ((TreeViewData)(bfmter.Deserialize(file)));
            treeData.PopupTree(treeView);
            file.Close();

        }

        /// <summary>
        /// 保存TreeView到文件
        /// </summary>
        /// <param name="treeView"></param>
        /// <param name="path"></param>
        public static void SaveTreeViewData(TreeView treeView, string path)
        {
            BinaryFormatter ser = new BinaryFormatter();
            Stream file = new FileStream(path, FileMode.Create);
            ser.Serialize(file, new TreeViewData(treeView));
            file.Close();

        }


    }


    /// <summary>
    /// 序列化,及反序列化DataTable
    /// </summary>
    class DataTable_Serialize
    {
        public static DataTable LoadDataTable(string path)
        {

            BinaryFormatter ser = new BinaryFormatter();
            Stream file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
            DataTable dt = (DataTable)ser.Deserialize(file);
            file.Close();
            return dt;
        }

        public static void SaveDataTable(DataTable dt, string path)
        {
            BinaryFormatter ser = new BinaryFormatter();
            Stream file = new FileStream(path, FileMode.Create);
            ser.Serialize(file, dt);
            file.Close();

        }
    }

}
View Code
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章