熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

c#實體類序列化方法

2022-06-13   來源: .NET編程 

  提到為了傳遞數據需要把作為載體的實體類序列化好好的找了一些序列化方面的介紹感覺下面的這個介紹比較容易介紹!

  什麼是序列化

  序列化是將對象狀態轉換為可保持或傳輸的格式的過程在序列化過程中對象的公共字段和私有字段以及類的名稱(包括包含該類的程序集)都被轉換為字節流然後寫入數據流與序列化相對的是反序列化它將流轉換為對象這兩個過程結合起來可以輕松地存儲和傳輸數據

  為什麼使用序列化

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

  我們經常需要將對象的字段值保存到磁盤中並在以後檢索此數據盡管不使用序列化也能完成這項工作但這種方法通常很繁瑣而且容易出錯並且在需要跟蹤對象的層次結構時會變得越來越復雜可以想象一下編寫包含大量對象的大型業務應用程序的情形程序員不得不為每一個對象編寫代碼以便將字段和屬性保存至磁盤以及從磁盤還原這些字段和屬性序列化提供了輕松實現這個目標的快捷方法

  b另一個原因是通過值將對象從一個應用程序域發送到另一個應用程序域中

  例如序列化可用於在 ASPNET 中保存會話狀態並將對象復制到 Windows 窗體的剪貼板中遠程處理還可以使用序列化通過值將對象從一個應用程序域傳遞到另一個應用程序域中

  公共語言運行時 (CLR) 管理對象在內存中的分布NET 框架則通過使用反射提供自動的序列化機制對象序列化後類的名稱程序集以及類實例的所有數據成員均被寫入存儲媒體中對象通常用成員變量來存儲對其他實例的引用類序列化後序列化引擎將跟蹤所有已序列化的引用對象以確保同一對象不被序列化多次NET 框架所提供的序列化體系結構可以自動正確處理對象圖表和循環引用對對象圖表的唯一要求是由正在進行序列化的對象所引用的所有對象都必須標記為 Serializable(請參閱基本序列化)否則當序列化程序試圖序列化未標記的對象時將會出現異常

  當反序列化已序列化的類時將重新創建該類並自動還原所有數據成員的值

  如何實現對象的序列化及反序列化

  要實現對象的序列化首先要保證該對象可以序列化而且序列化只是將對象的屬性進行有效的保存對於對象的一些方法則無法實現序列化的

  實現一個類可序列化的最簡便的方法就是增加Serializable屬性標記類

  [Serializable()]

  public class MEABlock

  {

  private int m_ID;

  public string Caption;

  public MEABlock()

  {

  ///構造函數

  }

  }

  即可實現該類的可序列化注意序列化的類必須為Public否則不能夠被序列化

  要將該類的實例序列化為到文件中?NET FrameWork提供了兩種方法

  a XML序列化

  使用 XmLSerializer 類可將下列項序列化

  公共類的公共讀/寫屬性和字段

  實現 ICollection 或 IEnumerable 的類(注意只有集合會被序列化而公共屬性卻不會

  XmlElement 對象

  XmlNode 對象

  DataSet 對象

  要實現上述類的實例的序列化可參照如下例子

  MEABlock myBlock = new MEABlock();

  // Insert code to set properties and fields of the object

  XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));

  // To write to a file create a StreamWriter object

  StreamWriter myWriter = new StreamWriter(myFileNamexml);

  mySerializerSerialize(myWriter MEABlock);

  需要注意的是XML序列化只會將public的字段保存對於私有字段不予於保存

  生成的XML文件格式如下

  <MEABlock>

  <Caption>Test</Caption>

  </MEABlock>

  對於對象的反序列化則如下

  MEABlock myBlock;

  // Constructs an instance of the XmlSerializer with the type

  // of object that is being deserialized

  XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));

  // To read the file creates a FileStream

  FileStream myFileStream = new FileStream(myFileNamexml FileModeOpen);

  // Calls the Deserialize method and casts to the object type

  myBlock = (MEABlock)mySerializerDeserialize(myFileStream)

  b 二進制序列化

  與XML序列化不同的是二進制序列化可以將類的實例中所有字段(包括私有和公有)都進行序列化操作這就更方便更准確的還原了對象的副本

  要實現上述類的實例的序列化可參照如下例子

  MEABlock myBlock = new MEABlock();

  // Insert code to set properties and fields of the object

  IFormatter formatter = new BinaryFormatter();

  Stream stream = new FileStream(MyFilebinFileModeCreateFileAccessWrite FileShareNone);

  formatterSerialize(stream myBlock);

  streamClose();

  對於對象的反序列化則如下

  IFormatter formatter = new BinaryFormatter();

  Stream stream = new FileStream(MyFilebin FileModeOpenFileAccessRead FileShareRead);

  MEABlock myBlock = (MEABlock) formatterDeserialize(stream);

  streamClose();

  如何變相實現自定義可視化控件的序列化反序列化

  對於WinForm中自定義控件由於繼承於SystemWindowsForm類而Form類又是從MarshalByRefObject繼承的窗體本身無法做到序列化窗體的實現基於Win下GUI資源不能脫離當前上下文存在

  當然可以采用變通的方法實現控件的序列化這裡采用的是記憶類模型

  定義記憶類(其實就是一個可序列化的實體類)用於記錄控件的有效屬性需要序列化控件的時候只需要將該控件的實例Copy到記憶類演變成序列化保存該記憶類的操作

  反序列化是一個逆過程將數據流反序列化成為該記憶類再根據該記憶類的屬性生成控件實例而對於控件的一些事件方法則可以繼續使用

  wwf之所以強調要把類實例化就是因為工作流和應用程序是在不同的線程中二者之間需要用類作為傳遞數據的載體的話就需要把該類定義為public序列化為二進制傳輸


From:http://tw.wingwit.com/Article/program/net/201311/13795.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.