C#中關於類的序列化

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   io   os   使用   ar   

1.什麼是序列化

 序列化是將對象狀態轉換為可保持或傳輸的格式的過程,在序列化過程中,對象的公用欄位和私人欄位以及類的名稱(包括包含該類的程式集)都被轉換為位元組流,然後寫入資料流。與序列化相對的是還原序列化,它將流轉換為對象。這兩個過程結合起來,可以輕鬆地儲存和傳輸資料。

2.為什麼使用序列化

一個原因是將對象的狀態保持在儲存媒體中,以便可以在以後重新建立精確的副本。

  我們經常需要將對象的欄位值儲存到磁碟中,並在以後檢索此資料。儘管不使用序列化也能完成這項工作,但這種方法通常很繁瑣而且容易出錯,並且在需要跟蹤對象的階層時,會變得越來越複雜。可以想象一下編寫包含大量對象的大型商務應用程式的情形,程式員不得不為每一個對象編寫代碼,以便將欄位和屬性儲存至磁碟以及從磁碟還原這些欄位和屬性。序列化提供了輕鬆實現這個目標的快捷方法。

另一個原因是通過值將對象從一個應用程式定義域發送到另一個應用程式定義域中。

  例如,序列化可用於在 ASP.NET 中儲存工作階段狀態並將對象複製到 Windows 表單的剪貼簿中。遠端還可以使用序列化通過值將對象從一個應用程式定義域傳遞到另一個應用程式定義域中。

  通用語言執行平台 (CLR) 管理對象在記憶體中的分布,.NET 架構則通過使用反射提供自動的序列化機制。對象序列化後,類的名稱、程式集以及類執行個體的所有資料成員均被寫入儲存媒體中。對象通常用成員變數來儲存對其他執行個體的引用。類序列化後,序列化引擎將跟蹤所有已序列化的引用對象,以確保同一對象不被序列化多次。.NET 架構所提供的序列化體繫結構可以自動正確處理對象圖表和循環參考。對對象圖表的唯一要求是,由進行中序列化的對象所引用的所有對象都必須標記為 Serializable(請參閱基本序列化)。否則,當序列化程式試圖序列化未標記的對象時將會出現異常。
  當還原序列化已序列化的類時,將重新建立該類,並自動還原所有資料成員的值。

(序列化技術的主要兩個目的是:持久化儲存、按值封送。)

 

3.如何?對象的序列化及還原序列化

   要實現對象的序列化,首先要保證該對象可以序列化。而且,序列化只是將對象的屬性進行有效儲存,對於對象的一些方法則無法實現序列化的。  
實現一個類可序列化的最簡便的方法就是增加Serializable屬性標記類。
即可實現該類的可序列化。注意序列化的類必須為Public,否則不能夠被序列化。


要將該類的執行個體序列化為到檔案中 .NET FrameWork提供了三種方法:


XML序列化

添加System.Runtime.Serialization.Formatters.Binary命名空間;

二進位序列化

添加System.Xml.Serialization命名空間;

NoSerialized屬性被Xmllgnore屬性替代;

soap序列化

典型應用:web service.

 


4.實現自訂序列化

如果你對資料流的組織方式不完全滿意,那麼可以通過在自訂類中實現介面ISerializable來自訂序列化,這個介面只有一個方法:GetObjectData,這個方法用於將對類對象進行序列化所需要的資料填進SerializationInfo對象。
另外還需提供一個格式化構造器,這個構造器的參數列表與GetObjectData相同,並且要聲明為私人的。這個格式化器的作用是構造SerializationInfo對象,然後在序列化時調用GetObjectData。


樣本如下:

using System;  using System.Data;  using System.Configuration;  using System.Web;  using System.Web.Security;  using System.Web.UI;  using System.Web.UI.WebControls;  using System.Web.UI.WebControls.WebParts;  using System.Web.UI.HtmlControls;  using System.Runtime.Serialization;  using System.Runtime.Serialization.Formatters.Binary;  /**//// ﹤summary﹥  /// Employee 的摘要說明  /// ﹤/summary﹥  [Serializable]  public class Employee:ISerializable  {  public int EmpId=100;  public string EmpName="劉德華";  [NonSerialized]  public string NoSerialString = "NoSerialString-Test";  public Employee()  {  //  // TODO: 在此處添加建構函式邏輯  //  }  private Employee(SerializationInfo info, StreamingContext ctxt)  {  EmpId = (int)info.GetValue("EmployeeId", typeof(int));  EmpName = (String)info.GetValue("EmployeeName",typeof(string));  //NoSerialString = (String)info.GetValue("EmployeeString",typeof(string));  }  public void GetObjectData(SerializationInfo info, StreamingContext ctxt)  {  info.AddValue("EmployeeId", EmpId);  info.AddValue("EmployeeName", EmpName);  //info.AddValue("EmployeeString", NoSerialString);  }  } 

 

C#序列化和還原序列化方法:

 

public void OtherEmployeeClassTest()  {  Employee mp = new Employee();  mp.EmpId = 10;  mp.EmpName = "邱楓";  mp.NoSerialString = "你好呀";  Stream steam = File.Open("c:\\temp3.dat", FileMode.Create);  BinaryFormatter bf = new BinaryFormatter();  Response.Write("Writing Employee Info:");  bf.Serialize(steam,mp);  steam.Close();  mp = null;  //C#序列化和還原序列化之還原序列化  Stream steam2 = File.Open("c:\\temp3.dat", FileMode.Open);  BinaryFormatter bf2 = new BinaryFormatter();  Response.Write("Reading Employee Info:");  Employee mp2 = (Employee)bf2.Deserialize(steam2);  steam2.Close();  Response.Write(mp2.EmpId);  Response.Write(mp2.EmpName);  Response.Write(mp2.NoSerialString);  } 

 

原文地址:http://skybirdzw.blog.163.com/blog/static/7257062620125371316992/

C#中關於類的序列化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.