序列化与反序列化
一、什么是序列化
简单的说,序列化就是格式化。是把数据按一定的格式保存起来,方便使用。
二、序列化的种类及其案例
首先创建要序列化的数据源,下面进行各种类型的序列化的时候需要用到。
1 List<Person> list = new List<Person>() { 2 new Person() { Name="张三",Age=19,Email="zhangsan@sina.com" }, 3 new Person() {Name="李四",Age=23,Email="lisi@sina.com" }, 4 new Person() {Name="王五",Age=34,Email="wangwu@sina.com" } 5 };
1.JavaScript序列化
1 JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); 2 string str = jsSerializer.Serialize(list); 3 4 using (StreamWriter sWrite = new StreamWriter("list.txt", false)) 5 { 6 sWrite.Write(str); 7 }
序列化后的结果:
1 [ 2 {"Name":"张三","Age":19,"Email":"zhangsan@sina.com"}, 3 {"Name":"李四","Age":23,"Email":"lisi@sina.com"}, 4 {"Name":"王五","Age":34,"Email":"wangwu@sina.com"} 5 ]
其实就是json形式的字符串。
2.xml序列化
1 XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Person>)); 2 3 using (FileStream fs = new FileStream("list.xml", FileMode.Create)) 4 { 5 xmlSerializer.Serialize(fs, list); 6 }
序列化后的结果:
1 <?xml version="1.0"?> 2 <ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3 <Person> 4 <Name>张三</Name> 5 <Age>19</Age> 6 <Email>zhangsan@sina.com</Email> 7 </Person> 8 <Person> 9 <Name>李四</Name> 10 <Age>23</Age> 11 <Email>lisi@sina.com</Email> 12 </Person> 13 <Person> 14 <Name>王五</Name> 15 <Age>34</Age> 16 <Email>wangwu@sina.com</Email> 17 </Person> 18 </ArrayOfPerson>
3.二进制序列化
1 BinaryFormatter binarySerializer = new BinaryFormatter(); 2 using (FileStream fs = new FileStream("binary.txt",FileMode.Create)) 3 { 4 binarySerializer.Serialize(fs,list); 5 }
序列化后的结果:
1 @搴忓垪鍖? Version=1.0.0.0, Culture=neutral, PublicKeyToken=null wSystem.Collections.Generic.List`1[[搴忓垪鍖?Person, 搴忓垪鍖? Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] _items_size_version 搴忓垪鍖?Person[] 搴忓垪鍖?Person 2 搴忓垪鍖?Person <Name>k__BackingField<Age>k__BackingField<Email>k__BackingField 寮犱笁 zhangsan@sina.com 鏉庡洓 3 4 lisi@sina.com 鐜嬩簲" wangwu@sina.com
注意:
1.反编译二进制后的exe文件,我们发现,二进制序列化是对属性对应的字段序列化,而不是对属性序列化,由于编译器生成的字段可能会变,所以,我们在进行序列化的时候,最好不要用自动属性。我们在person类中加几个字段,对比下。如图:
不是自动属性对应的结果:
自动属性对应的结果:
2.序列化List<person>时,person及其父类都要序列化,person中的所有成员对应的对象也要序列化。
3.方法不会序列化,同样类实现的接口也不用实例化。(接口对应方法)
4.如果某个字段不需要序列化,加上NonSerialized即可。
4.反序列化
反序列化就是把序列化后的文件中保存的数据,重新在保存的对象的中生成。它需要重新创建序列化时的对象,所以在反序列化的时候需要引用原来的对象,这也解释了,为什么序列化的时候,不需要序列化方法,属性,只需要把保存状态信息的东西序列化。如:数据-》字段的值
序列化的对象中的属性,方法,反序列化后会自动生成。
1 Person p = new Person() 2 { 3 _name = "saf", 4 _age = 19, 5 _email = "yahoo@sina.com", 6 _height = 32 7 }; 8 9 BinaryFormatter binarySerializer = new BinaryFormatter(); 10 using (FileStream fs = new FileStream("person.bin",FileMode.Create)) 11 { 12 binarySerializer.Serialize(fs,p); 13 } 14 Console.WriteLine("ok");
反序列化的代码如下:
1 using (FileStream fs = new FileStream("person.bin", FileMode.Open)) 2 { 3 BinaryFormatter bf = new BinaryFormatter(); 4 object obj= bf.Deserialize(fs); 5 6 7 Person p = obj as Person; 8 Console.WriteLine(p._height+" "+p._age+" "+p._name); 9 }