一、序列化就是将内存中的数据(对象、对象的集合等)保存到存储介质(流、文件等)中的过程。 序列化的目的是: 1、对象持久化。通过序列化,将对象等数据存储在硬盘之类的介质中,从而实现对象的持久化。 2、数据传输。通过序列化,可以将对象传输到过程,这样,远端应用程序获得数据就可以不再进行转换,直接使用对象进行数据操作了。 对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基 本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。 二、序列化的方式 1、二进制序列化。BinaryFormatter二进制序列化命名空间using System.Runtime.Serialization.Formatters.Binary; /// <summary> /// 二进制序列化方法 /// </summary> static void SerializaleObject() { List<Person> peoples = new List<Person>(); peoples.Add(new Person("成龙", 18)); peoples.Add(new Person("李龙", 19)); FileStream fs = new FileStream("peoples.dat", FileMode.Create);//创建新的文件 BinaryFormatter bf = new BinaryFormatter(); //实例化一个二进制的格式化器 bf.Serialize(fs, peoples); //使用二进制格式化器序列化人员集合 fs.Close(); Console.WriteLine("序列化成功,请按任意键结束。"); Console.ReadLine(); } /// <summary> /// 二进制反序列化方法 /// </summary> static void DeserializeObject() { FileStream fs = new FileStream("peoples.dat", FileMode.Open); //打开文件流 BinaryFormatter bf = new BinaryFormatter(); //实例化一个二进制格式化器 List<Person> peoples = (List<Person>)bf.Deserialize(fs); //使用二进制格式化器将文件流中的数据格式化反序列化到人员的泛型集合中 fs.Close(); peoples.Sort(); foreach (Person person in peoples) { Console.WriteLine(person.Name + "今年" + person.Age + "岁。"); } Console.ReadLine(); } 2、XML方式序列化,命名空间using System.Xml.Serialization; /// <summary> /// XML序列化方法 /// </summary> static void SerializaleObject1() { List<Person> peoples = new List<Person>(); peoples.Add(new Person("成龙", 18)); peoples.Add(new Person("李龙", 19)); FileStream fs = new FileStream("peoples.xml", FileMode.Create);//创建新的文件 XmlSerializer formatter = new XmlSerializer(typeof(List<Person>)); //实例化一个XML的格式化器,SoapFormatter是SOAP序列化 formatter.Serialize(fs, peoples); //使用XML格式化器序列化人员集合 fs.Close(); Console.WriteLine("序列化成功,请按任意键结束。"); Console.ReadLine(); } /// <summary> /// XML反序列化方法 /// </summary> static void DeserializeObject1() { FileStream fs = new FileStream("peoples.dat", FileMode.Open); //打开文件流 XmlSerializer formatter = new XmlSerializer(typeof(List<Person>)); //实例化一个XML格式化器 List<Person> peoples = (List<Person>)formatter.Deserialize(fs); //使用XML格式化器将文件流中的数据格式化反序列化到人员的泛型集合中 fs.Close(); peoples.Sort(); foreach (Person person in peoples) { Console.WriteLine(person.Name + "今年" + person.Age + "岁。"); } Console.ReadLine(); } 3、SOAP序列化 using System.Runtime.Serialization.Formatters.Soap; /// <summary> /// SOAP序列化方法 /// </summary> static void SerializaleObject1() { List<Person> peoples = new List<Person>(); peoples.Add(new Person("成龙", 18)); peoples.Add(new Person("李龙", 19)); FileStream fs = new FileStream("peoples.xml", FileMode.Create);//创建新的文件 SoapFormatter formatter = new SoapFormatter(typeof(List<Person>)); //实例化一个SOAP的格式化器,SoapFormatter是SOAP序列化 formatter.Serialize(fs, peoples); //使用SOAP格式化器序列化人员集合 fs.Close(); Console.WriteLine("序列化成功,请按任意键结束。"); Console.ReadLine(); } /// <summary> /// SOAP反序列化方法 /// </summary> static void DeserializeObject1() { FileStream fs = new FileStream("peoples.dat", FileMode.Open); //打开文件流 SoapFormatter formatter = new SoapFormatter(typeof(List<Person>)); //实例化一个SOAP格式化器 List<Person> peoples = (List<Person>)formatter.Deserialize(fs); //使用SOAP格式化器将文件流中的数据格式化反序列化到人员的泛型集合中 fs.Close(); peoples.Sort(); foreach (Person person in peoples) { Console.WriteLine(person.Name + "今年" + person.Age + "岁。"); } Console.ReadLine(); }