创建一个类: public class Person
{
//2.建议,在使用序列化的时候尽量避免使用自动属性,因为自动属性,每次编译的时候自动生成的字段名可能不一样,所以在反序列化的时候可能会造成问题。
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
private int _age;
public int Age
{
get
{
return _age;
}
set
{
_age = value;
}
}
2.实例化对象
Person p = new Person();
p.Name = "cizon";
p.Age = 16;
//对象序列化的步骤:
//1.创建二进制对象序列化器
BinaryFormatter bf = new BinaryFormatter();
//创建一个文件流
using (FileStream fs = new FileStream("person.bin", FileMode.Create))
{
//2.开始执行序列化
//将对象sly,序列化到fs文件流中,最终sly就保存到了person.bin文件中。
bf.Serialize(fs, sly);
}
Console.WriteLine("ok");
Console.ReadKey();
//Person类型要想被序列化,
//1.必须Person类型本身是可序列化的(Person类型标记为可序列化)
//2.类中所有的字段属性的类型也必须标记为可序列化的。
//3.当前类型的所有父类也必须标记为可序列化的。
[Serializable]
//反序列化步骤:
//1.创建二进制序列化器(格式化器)
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fs = new FileStream("person.bin", FileMode.Open))
{
//2.开始执行反序列化
//在执行反序列化的时候,由于person.bin中是存储的是原来Person类型序列化后的结果,所以要对person.bin反序列化时,需要Person类所在的程序集。
//问题:为什么反序列化的时候需要原来定义Person类的那个程序集?
//反序列话的时候,要返回一个对象,这个对象必须根据原来Person所在的程序集才能创建,也就是说person.bin中包含的仅仅是一些数据,根据这些数据是无法在内存中创建对象的。只能是根据原来Person类型的程序集来创建对象,然后把person.bin中的数据一一对应进行赋值。
//object obj = bf.Deserialize(fs);
//对象序列化,只是对对象的一些状态信息进行序列化(比如:字段)。
//对于方法之类的根本不进行序列化,也就是说person.bin中只包含字段名和字段值,根本没有方法信息。但是反序列化的时候,返回的是一个对象,那么只根据这些字段信息是无法创建对象的,所以这个时候需要先根据原来的程序集,获取Person类型,然后在内存中创建一个Person对象,然后再把反序列化得到的字段信息赋值给这个Person对象。
Person per = (Person)bf.Deserialize(fs);
Console.WriteLine("Name:{0},Age:{1}per.Name, per.Age);
}
Console.WriteLine("ok");
Console.ReadKey();
}