1,什么是序列化?
序列化 (Serialization)將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以后,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。序列化使其他代碼可以查看或修改那些不序列化便無法訪問的對象實例數據。確切地說,代碼執行序列化需要特殊的權限:即指定了 SerializationFormatter 標志的 SecurityPermission。在默認策略下,通過 Internet 下載的代碼或 Intranet 代碼不會授予該權限;只有本地計算機上的代碼才被授予該權限。
2.為什么使用序列化?
a. 一個原因是將對象的狀態保持在存儲媒體中,以便可以在以后重新創建精確的副本。我們經常需要將對象的字段值保存到磁盤 中,並在以后檢索此數據。盡管不使用序列化也能完成這項工作,但這種方法通常很繁瑣而且容易出錯,並且在需要跟蹤對象的層次結構時,會變得越來越復雜。可 以想象一下編寫包含大量對象的大型業務應用程序的情形,程序員不得不為每一個對象編寫代碼,以便將字段和屬性保存至磁盤以及從磁盤還原這些字段和屬性。序列化提供了輕松實現這個目標的快捷方法。
b.另一個原因是通過值將對象從一個應用程序域發送到另一個應用程序域中。例如,序列化可用於在 ASP.NET 中保存會話狀態並將對象復制到 Windows 窗體的剪貼板中。遠程處理還可以使用序列化通過值將對象從一個應用程序域傳遞到另一個應用程序域中。
(序列化技術的主要兩個目的是:持久化存、儲按值封送、數據保護。)
3怎樣進行序列化和反序列化?
a .XML序列化
添加System.Runtime.Serialization.Formatters.Binary命名空間;
b. 二進制序列化
添加System.Xml.Serialization命名空間;
NoSerialized屬性被Xmllgnore屬性替代;
c.soap序列化
典型應用:web service.
下面看一下二進制序列化:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; namespace serial1 { /// <summary> /// Person類的序列化 /// </summary> [Serializable] public class Person { public string Sno { get; set; } public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public string Other { get; set; } //非序列化的屬性 [NonSerialized] public string NoSerial; /// <summary> /// 成員函數 /// </summary> /// <returns></returns> public string DisplayInfo() { return "我的學號是:" + Sno + "\n我的名字是:" + Name + "\n我的性別為:" + Sex + "\n我的年齡:" + Age + "\n非序列化:" + NoSerial+"\n"; } } class Program { static void Main(string[] args) { //實例化兩個對象 var me = new Person { Sno = "1215115231", Name = "wuzhang", Sex = "man", Age = 22, NoSerial="不被序列化1", Other = "\n" }; var he = new Person { Sno = "1215115250", Name = "wanggang", Sex = "man", Age = 21, NoSerial = "不被序列化2", Other = "\n" }; List<Person> personInfo = new List<Person>(); personInfo.Add(me); personInfo.Add(he); //創建一個格式化程序的實例 IFormatter formatter = new BinaryFormatter(); //創建一個文件流 if (!File.Exists("F:\\TestTxt.txt")) { //FileStream fs1 = new FileStream("F:\\TestTxt.txt", FileMode.Create, FileAccess.Write);//創建寫入文件 Stream stream = new FileStream("F:\\TestTxt.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None); foreach(Person per in personInfo) { formatter.Serialize(stream, per); } stream.Close(); } else { Stream stream = new FileStream("F:\\TestTxt.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None); foreach (Person per in personInfo) { formatter.Serialize(stream, per); } stream.Close(); } Stream destream = new FileStream("F:\\TestTxt.txt", FileMode.Open, FileAccess.Read, FileShare.Read); var stillme = (Person)formatter.Deserialize(destream); var stillme1 = (Person)formatter.Deserialize(destream); Console.WriteLine(stillme.DisplayInfo()); Console.WriteLine(stillme1.DisplayInfo()); destream.Close(); Console.ReadLine(); } } }
運行結果:
其它兩種方式就不再實驗了,搞定!