这篇是针对上一篇讲序列化的文章的一个实际案例,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 else 18 { 19 MessageBox.Show("请选择要查看的文件"); 20 }
总结:
程序还有些Bug,因为主要的重点是放在序列化的使用上,日后如果有时间再完善功能吧。
1.对于新添加的日记,需要在下一次程序启动中才会加载到右侧listBox中(想法是做到保存后就加载到listBox);
2.对于日记的修改,修改内容后,点击保存,可适时看到修改的变化;而如果把标题和内容都修改了,程序则认为是一个全新的日记(Dictionary集合会因为key的不同,而重新添加)。
C# 序列化(二)二进制序列化的案例,布布扣,bubuko.com
时间: 2024-10-12 22:30:31