一、简介
C#序列化和反序列化主要通过BinaryFormatter对象实现,BinaryFormatter类提供了
反序列化方法Deserialize(Stream serializationStream),
序列化方法Serialize(Stream serializationStream, object graph),
它主要跟FileStream对象结合使用,使用它有几个注意地方:
1.引用
跟File类一样,我们要对它进行引用才可使用
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
2.对序列化的类进行声明
对需要序列化的类进行声明,否则报错,比如要对一个Stu类进行序列化和反序列化,在其上面添加[Serialize]即可。
[Serializable]
public class Stu
3.结合使用的对象FileStream使用后要关闭。
FileStream fs = new FileStream(Path,FileMode.Open)
BinaryFormatter bf = new BinaryFormatter();
cardInfos = (CardInfo[])bf.Deserialize(fs);
fs.Close();
调用它的Close();
二、下面简单的实现功能代码
主要是对Stu对象进行序列化和反序列化,Stu属性有Id、Name、Sex、Age
1.窗体布局,显示信息主要是ListView控件
2.代码实现
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace FileSerializeANDDeSerialization
{
public partial class Form1 : Form
{
//stu的 list
List<Stu> stus = new List<Stu>();
//文件夹路径
string DirPath = Application.StartupPath + "\\config";
//文件路径
string FilePath = Application.StartupPath + "\\config\\stu.cfg";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
//判断文件夹是否存在
if (!Directory.Exists(DirPath))
{
Directory.CreateDirectory(DirPath);
}
//判断文件是否存在
if (File.Exists(FilePath))
{
//声明一个FileStream 打开文件
FileStream fs = new FileStream(FilePath, FileMode.Open);
//声明序列化对象
BinaryFormatter bf = new BinaryFormatter();
//对文件进行反序列化,存放到stus
stus = (List<Stu>)bf.Deserialize(fs);
//展示信息
ShowList(stus);
//关闭流
fs.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
/// <summary>
/// 展示信息
/// </summary>
/// <param name="stus">信息对象</param>
private void ShowList(List<Stu> stus)
{
listView1.Items.Clear();
foreach (Stu item in stus)
{
ListViewItem listView = new ListViewItem(item.Id);
listView.SubItems.Add(item.Name);
listView.SubItems.Add(item.Sex);
listView.SubItems.Add(item.Age);
listView1.Items.Add(listView);
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
//判断内容是否为空
if (tbAge.Text != "" && tbID.Text != "" && tbName.Text != "" && tbSex.Text != "")
{
//声明一个对象存放信息
Stu stu = new Stu(tbID.Text, tbName.Text, tbSex.Text, tbAge.Text);
stus.Add(stu);
//声明一个FileStream 创建,存在就覆盖
FileStream fs = new FileStream(FilePath, FileMode.Create);
//声明序列化对象
BinaryFormatter bf = new BinaryFormatter();
//将stus对象进行序列化,存放到文件
bf.Serialize(fs, stus);
//关闭流
fs.Close();
//刷新显示列表
ShowList(stus);
MessageBox.Show("添加信息完成");
tbID.Text = tbAge.Text = tbName.Text = tbSex.Text = "";
}
else
{
MessageBox.Show("内容不能留空");
}
}
private void btnExit_Click(object sender, EventArgs e)
{
if (MessageBox.Show("是否关闭软件!", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
this.Close();
}
}
}
[Serializable]
public class Stu
{
public string Id { get; set; }
public string Sex { get; set; }
public string Name { get; set; }
public string Age { get; set; }
public Stu(string id, string name, string sex, string age)
{
this.Id = id;
this.Sex = sex;
this.Name = name;
this.Age = age;
}
}
}
3.效果