標籤:des style blog io ar color os 使用 sp
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(); } }}
運行結果:
其它兩種方式就不再實驗了,搞定!
C# 資料的序列化存取