对象序列化:是将对象转换为二进制数据
反序列化:是将二进制数据还原为对象。
对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。
对象序列化,只能针对对象的字段进行序列化。
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 }
