【博主】反骨仔 【原文地址】http://www.cnblogs.com/liqingwen/p/5902005.html
目录
一、序列化的含义
序列化 (Serialization)将对象的状态信息处理为字节流,以便于存储或传输到内存、数据库或文件的一个过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区,主要目的是保存对象的状态。便于日后从该状态中进行还原,创建新的对象,这个过程又称为反序列化。
1.1 序列化的工作方式
图1.1-1
对象被序列化为字节流(包括数据、对象的类型信息:如版本、区域性和程序集名称) --> 存储到 DB、IO 等地方。
1.2 用于序列化
我们在数据交换的时候常进行序列化保存对象的数据信息,在需要使用它的时候再进行反序列化重新读取对象的信息并进行校验和存储的一些工作。常用于 Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js 进行解析处理)。
1.3 使对象可序列化
进行序列化的操作,需要:一个带序列化的对象,一个是包含序列化对象的流和一个序列化器(Formatter)。
我们进行编写的类中,默认会给类加上 SerializableAttribute 特性的,当然你也可以使用显式的方式进行添加。当你打算对一个对象进行序列化时,如果它不包含 SerializableAttribute,将会引发异常。在某些时候,我们可能不希望类中的某些字段或属性进行序列化操作,你可以在该字段或属性上使用 NonSerializedAttribute ,以告诉序列化器不对它们进行序列化操作。
【备注】如果已序列化的类中包含了其他类对象的引用,而这些类又恰巧也有 SerializableAttribute,那么它们也会被进行序列化。
【备注】序列化的关键字特性:SerializableAttribute、NonSerializedAttribute。
这里介绍一种常见的序列化和一种不常见的序列化:
(1)二进制序列化:使用二进制编码来生成精简的序列化,会序列化所有成员,并提高性能。常用于存储和 socket 传输。
(2)XML 序列化:可读性更高,也就表示有更高的灵活性,操作的便利性。可用 XmlSerializer 进行序列化操作。
二、通过序列化保存对象数据
这里使用 demo 进行简单演示如何对对象进行序列化和反序列化操作。
2.1 使用序列化保存对象
1 [Serializable] //将类标记为可序列化 2 public class Coupon : INotifyPropertyChanged 3 { 4 public decimal Amount { get; set; } 5 6 public float InterestRate { get; set; } 7 8 public int Term { get; set; } 9 10 private string _name; 11 12 public string Name 13 { 14 get { return _name; } 15 set 16 { 17 _name = value; 18 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Customer")); 19 } 20 } 21 22 [field: NonSerialized()] //将可序列化的类中的某字段标记为不被序列化 23 public event PropertyChangedEventHandler PropertyChanged; 24 25 public Coupon(decimal amount, float interestRate, int term, string name) 26 { 27 Amount = amount; 28 InterestRate = interestRate; 29 Term = term; 30 _name = name; 31 } 32 }
1 static void Main(string[] args) 2 { 3 const string fileName = @"demo1.txt"; 4 var coupon = new Coupon(10000, 0.2f, 1, "反骨仔"); 5 6 using (var stream = File.Create(fileName)) 7 { 8 var deserializer = new BinaryFormatter(); //二进制格式序列化器 9 deserializer.Serialize(stream, coupon); //序列化对象到文件中 10 } 11 }