有时候需要将C#中某一个结构很复杂的类的对象存储起来,或者通过网路传输到远程的客户端程序中去, 这时候用文件方式或者数据库方式存储或者传送就比较麻烦了,这个时候,最好的办法就是使用串行和解串(Serialization & Deserialization).
.NET中串行有三种,BinaryFormatter, SoapFormatter和XmlSerializer.
1.看简单类型的序列化
//对象序列化
private void button1_Click(object sender, EventArgs e)
{
//对象以二进制流的方式写入文件里面
string s="成功学";
FileStream fs = File.OpenWrite(@"D:\config.txt");
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, s);//进行对象序列化
fs.Close();//关掉
}
//对象反序列化
private void button2_Click(object sender, EventArgs e)
{
Stream fs = File.OpenRead(@"D:\config.txt");//能用父类的尽量用父类
IFormatter bf = new BinaryFormatter();
object o=bf.Deserialize(fs);
fs.Close();
MessageBox.Show(o.ToString());
}
2.看类如何序列化和反序列化
[Serializable] //可以被序列化的类,不能继承
class Person
{
public int ID { get; set; }
public int Age { get; set; }
public string Name { get; set; }
public Person(int id, int age, string name)//构造函数
{
this.ID = id;
this.Age = age;
this.Name = name;
}
public string ShowInfo()
{
return String.Format("ID={0},Age={1},Name={2}",this.ID,this.Age,this.Name);
}
}
private void btnSerialaiz_Click(object sender, EventArgs e)//对象序列化
{
Person p1 = new Person(1,22,"格里芬");
Stream fs = File.OpenWrite(@"D:\class.data");
IFormatter bf = new BinaryFormatter();
bf.Serialize(fs,p1);
fs.Close();
}
private void btnDes_Click(object sender, EventArgs e)//对象反序列化
{
Stream fs = File.OpenRead(@"D:\class.data");
IFormatter bf = new BinaryFormatter();
Person p1=(Person)bf.Deserialize(fs);
MessageBox.Show( p1.ShowInfo());
fs.Close();
}