序列化
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程,序列把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中
序列化的主要目的有三个:
1)以某种存储形式使自定义对象持久化;
2)将对象从一个地方传递到另一个地方;
3)使程序更具维护。
对于需要序列化的对象,需要在类前面声明[Serializable],表示其可序列化,其语法格式如下所示:
[Serializable]//表示类可以序列化
public class Person
{
string _name;
public string Name { get => _name; set => _name = value; }
public string Gender { get => _gender; set => _gender = value; }
string _gender;
}
反序列化
反序列化指把字节序列恢复为对象的过程,即将二进制转化为对象,客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象
序列化和反序列化的过程如下所示:
static void Main(string[] args)
{
//要将p1这个对象,传输给对方电脑
Person p1 = new Person();
p1.Name = "张三";
p1.Gender = "男";
using (FileStream fsWrite = new FileStream(@"C:\Users\91134\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
//开始序列化对象
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fsWrite, p1);
}
Console.WriteLine("序列化成功");
//接受对方发送过来的二进制 反序列化成对象
Person p;
using (FileStream fsRead = new FileStream(@"C:\Users\91134\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Read))
{
BinaryFormatter bf1 = new BinaryFormatter();
p=(Person) bf1.Deserialize(fsRead);
}
Console.WriteLine("反序列化成功");
Console.WriteLine(p.Name);
Console.WriteLine(p.Gender);
Console.ReadKey();
}
序列化与反序列化重要是利用Serialize、Deserialize两个方法,而在.net framework的类库中提供了三个可以用于序列化和反序列化的类,分别为BinaryFormatter、SoapFormatter和XmlSerializer,这三种类对象都可调用序列化和反序列的方法进行操作。
BinaryFormatter可以对单个对象,或集合对象(如List、ObservableCollection)进行序列化。
需要指出的是,需要对被序列化的对象添加[Serializable]特性,也就是我们上述提到的格式
XmlSerializer,无论对于单个对象还是集合对象(如List、ObservableCollection),都可以使用XmlSerializer进行序列化。需要指出的是,不需要对被序列化的对象添加[Serializable]特性注解。但是,使用XmlSeriabizable的时候,被序列化的对象应该具有无参数构造函数
而SoapFormatter现在基本被淘汰,不被使用了,用法与BinaryFormatter类似
总结
序列化步骤:
1.得到一个存储对象的类型
2.创建一个写入文件流
3.定义要序列化的类型
4.调用序列化方法
反序列化步骤:
1.定义一个装载对象的类型
2.创建一个读出文件流
3.定义要反序列化的类型
4.调用反序列化方法
二进制序列化的优点:
1. 所有的类成员(包括只读的)都可以被序列化;
2. 性能非常好。
XML序列化的优点:
1. 互操作性好;
2. 不需要严格的二进制依赖;
3. 可读性强
参考链接
1、c# 序列化BinaryFormatter、SoapFormatter和XmlSerializer的区别
2、序列化和反序列化
--------------------------------------以上内容由作者原创,欢迎转载,部分从网络整理,如侵权清联系删除----------------------------------------------
转载:https://blog.csdn.net/weixin_44985601/article/details/104763558