序列化与反序列化

一、什么是序列化

简单的说,序列化就是格式化。是把数据按一定的格式保存起来,方便使用。

二、序列化的种类及其案例

首先创建要序列化的数据源,下面进行各种类型的序列化的时候需要用到。

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             };
View Code

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             }
View Code

序列化后的结果:

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 ]
View Code

其实就是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             }
View Code

序列化后的结果:

 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>
View Code

3.二进制序列化 

1 BinaryFormatter binarySerializer = new BinaryFormatter();
2             using (FileStream fs = new FileStream("binary.txt",FileMode.Create))
3             {
4                 binarySerializer.Serialize(fs,list);
5             }
View Code

 序列化后的结果:

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
View Code

注意:

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");
View Code

反序列化的代码如下:

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             }
View Code
原文地址:https://www.cnblogs.com/wesley168/p/6636327.html