【博主】反骨仔 【原文地址】http://www.cnblogs.com/liqingwen/p/5902005.html
對象被序列化為流。流傳遞的不僅是數據,還包括有關對象類型的信息,如對象的版本、區域性和程序集名稱。通過該流,可以將對象存儲在數據庫、文件或內存中。
基本序列化的唯一要求是對象必須應用 SerializableAttribute 特性。 NonSerializedAttribute 可用於禁止序列化特定字段。
使用基本序列化時,對象的版本控制可能會產生問題,在這種情況下,自定義序列化可能更合適。基本序列化是執行序列化的最簡單的方法,但對進程提供的控制並不多。
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 }
現在嘗試反序列化,看看與之前 Coupon 對象的值是否一致。
1 static void Main(string[] args)
2 {
3 const string fileName = @"demo1.txt";
4 //var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");
5
6 //判斷該文件是否存在
7 if (!File.Exists(fileName))
8 {
9 return;
10 }
11
12 using (var stream = File.OpenRead(fileName))
13 {
14 var deserializer = new BinaryFormatter(); //二進制序列化器
15 var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化
16
17 if (coupon == null)
18 {
19 return;
20 }
21
22 Console.WriteLine($"{nameof(Coupon)}:");
23 Console.WriteLine($" {nameof(coupon.Amount)}: {coupon.Amount}");
24 Console.WriteLine($" {nameof(coupon.InterestRate)}: {coupon.InterestRate}%");
25 Console.WriteLine($" {nameof(coupon.Term)}: {coupon.Term}");
26 Console.WriteLine($" {nameof(coupon.Name)}: {coupon.Name}");
27 }
28
29 Console.Read();
30 }
圖2-2
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 SoapFormatter(); //Soap 格式化器
9 deserializer.Serialize(stream, coupon); //序列化
10 }
11 }
圖2-3
反序列化時也采用 SoapFormatter 即可,結果同圖2-2。
var deserializer = new SoapFormatter(); //Soap 格式化器
var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化
【注意】本示例將數據存儲到二進制或 SOAP 格式的文件中。不應將這些格式用於敏感數據,如密碼或信用卡信息。
【備注】二進制格式對於大多數 Windows 應用程序均適用。但對於 Web 應用程序或 Web 服務,您可能希望使用 SOAP 格式將對象保存到 XML 文件中,以使對象易於共享。
也可以通過 XmlSerializer 將對象序列化保存在 XML 文件。根據需求選擇合適的序列化器,操作基本是一樣的。
---預覽版,待整理完畢放到首頁---