序列化就是将数据(比如属性与字段的值)以列外一种格式进行保存;序列化后只是将存储格式变了,实际内容其实没有变。
有序列化就会有反序列化;Json序列化(JavaScriptSerialize),XML序列化(XMLSerialize),二进制序列化;
这里主要总结一下二进制序列化
二进制序列化就是变成流的过程,就是把对象编成byte数组
static void Main(string[] args)
{
person per = new person() { Name = "老杨", Age = 19, Email = "1111@qq.com" };
//json序列化
JavaScriptSerializer js = new JavaScriptSerializer();
string strjson = js.Serialize(per);
//xml序列化
XmlSerializer xs = new XmlSerializer(typeof(person));
using (FileStream fs = new FileStream("first.xml", FileMode.Create))
{
xs.Serialize(fs, per);
}
//1、创建二进制序列化器
BinaryFormatter bf = new BinaryFormatter();
//1.1创建一个文件流
using (FileStream fs = new FileStream("person.bin", FileMode.Create))
{
//2、开始执行序列化
bf.Serialize(fs, per);
}
Console.WriteLine("序列化完毕");
Console.ReadKey();
}
注意:
1、二进制序列化需要给对象前加上[Serializable]特性
2、要求被序列化的所有父类必须被标记为[Serializable]
3、要求被序列化的对象的类型中的属性、字段必须被标记为"可序列话的",也就是加上[Serializable],方法不参与序列化
4、要是想让一个字段不被序列化,在这个字段前加上[NonSerialized],注意是字段不是属性;属性是不能直接加的
反序列化
static void Main(string[] args)
{
//创建序列化器
BinaryFormatter bf = new BinaryFormatter();
//打开文件流
using (FileStream fs = new FileStream("person.bin",FileMode.Open))
{
//执行反序列化
person obj = bf.Deserialize(fs) as person;
Console.WriteLine(obj.Name);
Console.WriteLine(obj.Age);
Console.WriteLine(obj.Email);
}
Console.WriteLine("反序列化完毕");
Console.ReadKey();
}
二进制反序列化注意:
必须获取序列化对象所在的程序集,因为二进制反序列化要根据序列化文件重新还原该对象,而序列化文件中只包含了一些数据信息,比如该对象继承了那些类与接口啊,里面有什么方法啊……这些信息在序列化文件中都不包含,需要根据对象所在的程序集来获取