码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-05 00:29:20      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:des   winform   style   blog   color   使用   os   io   

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

bubuko.com,布布扣

     思路:在点击保存按钮时,将标题和内容保存到集合中,自然想到应该是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             else
18             {
19                 MessageBox.Show("请选择要查看的文件");
20             }

总结:

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

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

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

 

C# 序列化(二)二进制序列化的案例,布布扣,bubuko.com

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

标签:des   winform   style   blog   color   使用   os   io   

原文地址:http://www.cnblogs.com/chens2865/p/3891306.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!