日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
.NET序列化和反序列化基礎(chǔ)知識總結(jié)

.NET序列化和反序列化的學(xué)習(xí)中都會涉及到什么概念呢?在我們學(xué)習(xí)之前其實還是要明白問什么會有.NET序列化,它存在的必要性是什么?是如何實現(xiàn)的呢?那么下面我們逐一介紹

.NET序列化的概念:

“序列化”可被定義為將對象的狀態(tài)存儲到存儲媒介中的過程。在此過程中,對象的公共字段和私有字段以及類的名稱(包括包含該類的程序集)都被轉(zhuǎn)換為字節(jié)流,然后寫入數(shù)據(jù)流。在以后“反序列化”該對象時,創(chuàng)建原始對象的精確復(fù)本。

一、.NET序列化和反序列化的必要性

1、將對象的狀態(tài)保持在存儲媒體中,以便可以在以后重新創(chuàng)建精確的副本;

2、通過值將對象從一個應(yīng)用程序域發(fā)送到另一個應(yīng)用程序域中。

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

二、如何實現(xiàn).NET序列化和反序列化

1、要實現(xiàn)對象的序列化,首先要保證該對象可以序列化。而且,序列化只是將對象的屬性進行有效的保存,對于對象的一些方法則無法實現(xiàn)序列化的。實現(xiàn)一個類可序列化的最簡便的方法就是增加Serializable屬性標記類。如:

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

即可實現(xiàn)該類的可序列化。

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

(1)XML序列化

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

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

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

◆XmlElement 對象。

◆XmlNode 對象。

◆DataSet 對象。

要實現(xiàn)上述類的實例的序列化,可參照如下例子:

 
 
 
  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.  
  2. Test

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

 
 
 
  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)

(2)二進制序列化

與XML序列化不同的是,二進制序列化可以將類的實例中所有字段(包括私有和公有)都進行序列化操作。這就更方便、更準確的還原了對象的副本。
要實現(xiàn)上述類的實例的序列化,可參照如下例子:

 
 
 
  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(
  5. "MyFile.bin",FileMode.Create,FileAccess.Write, FileShare.None);
  6. formatter.Serialize(stream, myBlock);
  7. stream.Close();

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

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

三、如何變相實現(xiàn)自定義可視化控件的.NET序列化和反序列化

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

當然可以采用變通的方法實現(xiàn)控件的序列化。這里采用的是記憶類模型。定義記憶類(其實就是一個可序列化的實體類)用于記錄控件的有效屬性,需要序列化控件的時候,只需要將該控件的實例Copy到記憶類,演變成序列化保存該記憶類的操作。

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

.NET序列化和反序列化的基礎(chǔ)概念和簡單的實現(xiàn)過程就向你介紹到這里,希望對你了解和學(xué)習(xí).NET序列化和反序列化有所幫助。


網(wǎng)頁題目:.NET序列化和反序列化基礎(chǔ)知識總結(jié)
鏈接分享:http://www.5511xx.com/article/ccedjpi.html