序列化与反序列化

  对象序列化:是将对象转换为二进制数据

  反序列化:是将二进制数据还原为对象。

  对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象持久化

  对象序列化,只能针对对象的字段进行序列化。

BinaryFormatter类有两个方法:

  • void Serialize(Stream stream,object graph) 对象graph序列化到stream中

  • object Deserialize(Stream stream) 将对象从stream中反序列化,返回值为反序列化得到的对象。

注:不是所有对象都能序列化,只有可序列化的对象才能序列化,在类的声明上加[Serializable],对象的属性、字段的类型也必须可序列化

一、序列化

json序列化

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Person p1 = new Person();
 6             p1.Name = "Alex";
 7             p1.Age = 19;
 8             p1.Email = "Alex@163.com";
 9             //需引用 System.web.Extensions
10             //命名空间 using System.Web.Script.Serialization;
11             JavaScriptSerializer jsSer = new JavaScriptSerializer();
12             string msg = jsSer.Serialize(p1);
13             Console.WriteLine(msg);
14             Console.ReadKey();
15         }
16     }
17     public class Person
18     {
19         public string Name { get; set; }
20         public int Age { get; set; }
21         public string Email { get; set; }
22     }

 xml序列化

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Person p1 = new Person();
 6             p1.Name = "Alex";
 7             p1.Age = 19;
 8             p1.Email = "Alex@163.com";
 9 
10             //需引用 System.web.Extensions
11             //命名空间 using System.Xml.Serialization;
12             XmlSerializer xml = new XmlSerializer(typeof(Person));
13             using (FileStream fs=new FileStream("Person.xml",FileMode.Create))
14             {
15                 xml.Serialize(fs,p1);
16             }
17             Console.WriteLine("ok");
18             Console.ReadKey();
19         }
20     }
21     public class Person
22     {
23         public string Name { get; set; }
24         public int Age { get; set; }
25         public string Email { get; set; }
26     }

 二进制序列化

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Person p1 = new Person();
 6             p1.Name = "Alex";
 7             p1.Age = 19;
 8             p1.Email = "Alex@163.com";
 9             //二进制序列化注意点:
10             //1、被序列化的对象的类型必须标记为“可序列化” -->[Serializable]
11 
12             //二进制序列化步骤
13             //1、创建序列化器
14             BinaryFormatter bf = new BinaryFormatter(); //命名空间 using System.Runtime.Serialization.Formatters.Binary;
15             //1.1、创建一个文件流
16             using (FileStream fs = new FileStream("person.bin",FileMode.Create))
17             {
18                 //2、开始执行序列化
19                 bf.Serialize(fs, p1);
20             }
21             Console.WriteLine("ok");
22             Console.ReadKey();
23         }
24     }
25     // 注意:二进制序列化,必须标记为:[Serializable]
26     [Serializable]
27     public class Person
28     {
29         public string Name { get; set; }
30         public int Age { get; set; }
31         public string Email { get; set; }
32         public void Say()
33         {
34             Console.WriteLine("ok1");
35         }
36     }
 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Person p1 = new Person();
 6             p1.Name = "Alex";
 7             p1.Age = 19;
 8             p1.Email = "Alex@163.com";
 9             p1.BenChi = new Car();
10             //二进制序列化注意点:
11             //1、被序列化的对象的类型必须标记为“可序列化” -->[Serializable]
12             //2、被序列化的类的所有弗雷必须标记为“可序列化”
13             //3、要求被序列化的对象的类型中的所有字段的类型也必须标记为“可序列化”
14 
15             //二进制序列化步骤
16             //1、创建序列化器
17             BinaryFormatter bf = new BinaryFormatter(); //命名空间 using System.Runtime.Serialization.Formatters.Binary;
18             //1.1、创建一个文件流
19             using (FileStream fs = new FileStream("person.bin",FileMode.Create))
20             {
21                 //2、开始执行序列化
22                 bf.Serialize(fs, p1);
23             }
24             Console.WriteLine("ok");
25             Console.ReadKey();
26         }
27     }
28     [Serializable]
29     public class Animal
30     {
31         public void Eat()
32         {
33             Console.WriteLine("吃东西。");
34         }
35     }
36     // 注意:二进制序列化,必须标记为:[Serializable]
37     [Serializable]
38     public class Person:Animal
39     {
40         public Car BenChi { get; set; }
41         public string Name { get; set; }
42         public int Age { get; set; }
43         public string Email { get; set; }
44 
45         public void Say()
46         {
47             Console.WriteLine("ok1");
48         }
49     }
50     [Serializable]
51     public class Car
52     {
53 
54     }
二进制补充

 补充:

在字段属性前加[NonSerialized]不被序列化

 1         [NonSerialized]
 2         private string _name;
 3         public string name
 4         {
 5             get
 6             {
 7                 return _name;
 8             }
 9             set
10             {
11                 _name = value;
12             }
13         }

 二、反序列化

二进制反序列化:需引用序列化的dll

注:反序列化要根据序列化文件重新还原该对象,而序列化文件中只包含那些数据信息,并不包含该对象的类型相关的信息,比如:该对象是继承自那个父类,实现了哪些接口,类型中包含哪些方法。。。这些信息在对象序列化文件中都不包含,要获取这些信息必须通过该类型的程序集来获取。

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             // 命名空间 using System.Runtime.Serialization.Formatters.Binary;
 6             // 命名空间 using System.IO;
 7             //1、创建序列化器
 8             BinaryFormatter bf = new BinaryFormatter();
 9             //1.1、创建读取文件的文件流
10             using (FileStream fs=new FileStream("person.bin", FileMode.Open))
11             {
12                 //2、执行反序列化
13                 object obj = bf.Deserialize(fs);
14                 Person p1 = obj as Person;
15                 Console.WriteLine(p1.Name);
16                 Console.WriteLine(p1.Age);
17                 Console.WriteLine(p1.Email);
18             }
19             Console.WriteLine("ok");
20             Console.ReadKey();
21         }
22     }

posted @ 2019-06-21 12:22  陈彦斌  阅读(438)  评论(0编辑  收藏  举报