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