首页 > 代码库 > C# 序列化(二)二进制序列化的案例

C# 序列化(二)二进制序列化的案例

     这篇是针对上一篇讲序列化的文章的一个实际案例,WinForm程序的主界面如下:

     思路:在点击保存按钮时,将标题和内容保存到集合中,自然想到应该是Dictionary<K,V>,而且用这个集合可以避免产生2个相同标题的日记。对添加到集合中的数据,采用二进制序列化到文件中,在程序执行目录中专门建一个“Notes”的文件夹存放日记文件,日记文件的文件名以标题命名。程序加载的时候,如果“Notes”文件夹下有文件,就在右侧列表中加载文件,点击时反序列化后显示在左侧。下面是具体代码:

在Form1类下定义一个集合:

1 Dictionary<string, string> dic = new Dictionary<string, string>();

“保存”按钮的点击操作代码如下:

 1             var sTitle = txtTitle.Text.Trim(); 2             var sContent = txtContent.Text.Trim(); 3  4             dic.Add(sTitle, sContent); 5  6             string fullPath = Path.Combine("Notes", sTitle + ".txt"); 7             using (FileStream fsWrite=new FileStream(fullPath,FileMode.Create,FileAccess.Write)) 8             { 9                 //进行二进制序列化10                 BinaryFormatter bf = new BinaryFormatter();11                 bf.Serialize(fsWrite, dic);12                 MessageBox.Show("添加日记成功");13             }

在Form1_Load中的事件处理代码如下:

 1             string sPath1 = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 2             string sPath2 = "Notes"; 3             string fullPath1 = Path.Combine(sPath1, sPath2); 4             string[] strFiles = Directory.GetFiles(fullPath1, "*.txt"); 5  6             if (strFiles.Length>0) 7             { 8                 foreach (string item in strFiles) 9                 {10                     var s = Path.GetFileName(item);11                     listBox1.Items.Add(s);12                 }   13             }

在listBox1_SelectedValueChanged中的事件处理代码如下:

 1           if (listBox1.SelectedItem!=null) 2             { 3                 var FileName = listBox1.SelectedItem.ToString(); 4                 var fullPath2 = Path.Combine("Notes", FileName); 5                 using (FileStream fsRead=new FileStream(fullPath2,FileMode.Open,FileAccess.Read)) 6                 { 7                     BinaryFormatter bf1 = new BinaryFormatter(); 8                     //进行二进制反序列化 9                     Dictionary<string, string> dic2 = bf1.Deserialize(fsRead) as Dictionary<string, string>;10                     foreach (KeyValuePair<string,string> item in dic2)11                     {12                         txtTitle.Text = item.Key;13                         txtContent.Text = item.Value;14                     }15                 }16             }17             else18             {19                 MessageBox.Show("请选择要查看的文件");20             }

总结:

   程序还有些Bug,因为主要的重点是放在序列化的使用上,日后如果有时间再完善功能吧。

   1.对于新添加的日记,需要在下一次程序启动中才会加载到右侧listBox中(想法是做到保存后就加载到listBox);

   2.对于日记的修改,修改内容后,点击保存,可适时看到修改的变化;而如果把标题和内容都修改了,程序则认为是一个全新的日记(Dictionary集合会因为key的不同,而重新添加)。