成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

c#.net實體類序列化方法

開發 后端
序列化是將對象狀態轉換為可保持或傳輸的格式的過程,在序列化過程中,對象的公共字段和私有字段以及類的名稱(包括包含該類的程序集)都被轉換為字節流,然后寫入數據流。與序列化相對的是反序列化,它將流轉換為對象。本文主要介紹實體類序列化,一起來看。

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

1.什么是序列化

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

2.為什么使用序列化

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

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

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

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

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

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

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

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

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

  1. [Serializable()]  
  2. public class MEABlock  
  3. {  
  4. private int m_ID;  
  5. public string Caption;  
  6. public MEABlock()  
  7. {  
  8. ///構造函數  
  9. }  

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

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

a .XML序列化

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

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

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

XmlElement 對象。

XmlNode 對象。

DataSet 對象。

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

  1. MEABlock myBlock = new MEABlock();  
  2. // Insert code to set properties and fields of the object.  
  3. XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));  
  4. // To write to a file, create a StreamWriter object.  
  5. StreamWriter myWriter = new StreamWriter("myFileName.xml");  
  6. mySerializer.Serialize(myWriter, MEABlock); 

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

生成的XML文件格式如下:

  1. <MEABlock> 
  2. <Caption>Test</Caption> 
  3. </MEABlock> 

對于對象的反序列化,則如下:

  1. MEABlock myBlock;  
  2. // Constructs an instance of the XmlSerializer with the type  
  3. // of object that is being deserialized.  
  4. XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));  
  5. // To read the file, creates a FileStream.  
  6. FileStream myFileStream = new FileStream("myFileName.xml", FileMode.Open);  
  7. // Calls the Deserialize method and casts to the object type.  
  8. myBlock = (MEABlock)mySerializer.Deserialize(myFileStream) 

b. 二進制序列化

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

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

  1. MEABlock myBlock = new MEABlock();  
  2. // Insert code to set properties and fields of the object.  
  3. IFormatter formatter = new BinaryFormatter();  
  4. Stream stream = new FileStream("MyFile.bin",FileMode.Create,FileAccess.Write, FileShare.None);  
  5. formatter.Serialize(stream, myBlock);  
  6. stream.Close(); 

對于對象的反序列化,則如下:

  1. IFormatter formatter = new BinaryFormatter();  
  2. Stream stream = new FileStream("MyFile.bin", FileMode.Open,FileAccess.Read, FileShare.Read);  
  3. MEABlock myBlock = (MEABlock) formatter.Deserialize(stream);  
  4. stream.Close(); 

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

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

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

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

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

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

【編輯推薦】

  1. 關于Java對象序列化您不知道的5件事
  2. 為什么使用Serializable(序列化)
  3. 對象的序列化和反序列化
  4. Java中的String與常量池
  5. C++中基類對象安全轉換為派生類對象的方法
責任編輯:于鐵 來源: 互聯網
相關推薦

2009-08-25 13:53:20

C#.NET rege

2011-05-18 15:20:13

XML

2009-08-24 17:14:08

C#序列化

2009-08-19 15:44:09

ObjectARX .

2009-08-06 11:16:25

C#序列化和反序列化

2009-09-09 16:10:11

.NET序列化和反序列

2011-06-01 14:50:48

2009-08-25 14:24:36

C#序列化和反序列化

2009-07-29 13:39:02

JSON序列化和反序列ASP.NET AJA

2011-06-01 14:26:11

序列化

2009-09-09 15:47:27

XML序列化和反序列化

2009-09-09 14:45:41

XML序列化和反序列化

2009-08-25 14:43:26

C#序列化和反序列化

2022-08-06 08:41:18

序列化反序列化Hessian

2009-08-19 16:05:46

AutoCADEditor類

2009-08-26 14:23:14

C#.Net Fram

2024-05-06 00:00:00

C#序列化技術

2011-06-01 15:05:02

序列化反序列化

2009-08-24 16:19:54

C#.NET綁定Off

2009-08-26 10:09:22

C#編碼規范
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二 | 久色网| 天天射夜夜操 | 色资源在线视频 | 在线免费观看日本 | 九九九久久国产免费 | 亚洲精品天堂 | 国产电影一区二区在线观看 | 欧美日韩精品久久久免费观看 | 一区二区日本 | 日韩成人免费视频 | 亚洲欧美日韩在线 | 综合久久久久 | 国产一区二区美女 | 青青久久av北条麻妃海外网 | 涩涩视频在线看 | 亚洲成人免费 | 亚洲在线视频 | 久久精品二区 | 免费超碰| 作爱视频免费看 | 久久神马| 日韩欧美亚洲综合 | 羞羞的视频在线看 | 亚洲成人精品 | 伊人网综合 | 国产日屁 | 国产91精品网站 | 久久国产精品一区二区三区 | 成人精品视频在线观看 | 91综合网 | 365夜爽爽欧美性午夜免费视频 | 男人av网 | 精品在线一区二区三区 | 久久久久久久久99 | 中文天堂在线观看 | 中文在线一区二区 | 成人在线精品视频 | 国产精品国产成人国产三级 | 成人动慢| av无遮挡|