.NET序列化和反序列化基礎(chǔ)知識(shí)總結(jié)
.NET序列化和反序列化的學(xué)習(xí)中都會(huì)涉及到什么概念呢?在我們學(xué)習(xí)之前其實(shí)還是要明白問(wèn)什么會(huì)有.NET序列化,它存在的必要性是什么?是如何實(shí)現(xiàn)的呢?那么下面我們逐一介紹
.NET序列化的概念:
“序列化”可被定義為將對(duì)象的狀態(tài)存儲(chǔ)到存儲(chǔ)媒介中的過(guò)程。在此過(guò)程中,對(duì)象的公共字段和私有字段以及類(lèi)的名稱(chēng)(包括包含該類(lèi)的程序集)都被轉(zhuǎn)換為字節(jié)流,然后寫(xiě)入數(shù)據(jù)流。在以后“反序列化”該對(duì)象時(shí),創(chuàng)建原始對(duì)象的精確復(fù)本。
一、.NET序列化和反序列化的必要性
1、將對(duì)象的狀態(tài)保持在存儲(chǔ)媒體中,以便可以在以后重新創(chuàng)建精確的副本;
2、通過(guò)值將對(duì)象從一個(gè)應(yīng)用程序域發(fā)送到另一個(gè)應(yīng)用程序域中。
例如,序列化可用于在 ASP.NET 中保存會(huì)話狀態(tài)并將對(duì)象復(fù)制到 Windows 窗體的剪貼板中。遠(yuǎn)程處理還可以使用序列化通過(guò)值將對(duì)象從一個(gè)應(yīng)用程序域傳遞到另一個(gè)應(yīng)用程序域中。
二、如何實(shí)現(xiàn).NET序列化和反序列化
1、要實(shí)現(xiàn)對(duì)象的序列化,首先要保證該對(duì)象可以序列化。而且,序列化只是將對(duì)象的屬性進(jìn)行有效的保存,對(duì)于對(duì)象的一些方法則無(wú)法實(shí)現(xiàn)序列化的。實(shí)現(xiàn)一個(gè)類(lèi)可序列化的最簡(jiǎn)便的方法就是增加Serializable屬性標(biāo)記類(lèi)。如:
- [Serializable()]
- public class MEABlock
- {
- private int m_ID;
- public string Caption;
- public MEABlock()
- {
- ///構(gòu)造函數(shù)
- }
- }
即可實(shí)現(xiàn)該類(lèi)的可序列化。
2、要將該類(lèi)的實(shí)例序列化為到文件中?.NET FrameWork提供了兩種方法:
(1)XML序列化
使用 XmLSerializer 類(lèi),可將下列項(xiàng)序列化。
◆公共類(lèi)的公共讀/寫(xiě)屬性和字段
◆實(shí)現(xiàn) ICollection 或 IEnumerable 的類(lèi)。(注意只有集合會(huì)被序列化,而公共屬性卻不會(huì)。)
◆XmlElement 對(duì)象。
◆XmlNode 對(duì)象。
◆DataSet 對(duì)象。
要實(shí)現(xiàn)上述類(lèi)的實(shí)例的序列化,可參照如下例子:
- 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("myFileName.xml");
- mySerializer.Serialize(myWriter, MEABlock);
需要注意的是XML序列化只會(huì)將public的字段保存,對(duì)于私有字段不予于保存。生成的XML文件格式如下:
Test
對(duì)于對(duì)象的反序列化,則如下:
- 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("myFileName.xml", FileMode.Open);
- // Calls the Deserialize method and casts to the object type.
- myBlock = (MEABlock)mySerializer.Deserialize(myFileStream)
(2)二進(jìn)制序列化
與XML序列化不同的是,二進(jìn)制序列化可以將類(lèi)的實(shí)例中所有字段(包括私有和公有)都進(jìn)行序列化操作。這就更方便、更準(zhǔn)確的還原了對(duì)象的副本。
要實(shí)現(xiàn)上述類(lèi)的實(shí)例的序列化,可參照如下例子:
- MEABlock myBlock = new MEABlock();
- // Insert code to set properties and fields of the object.
- IFormatter formatter = new BinaryFormatter();
- Stream stream = new FileStream(
- "MyFile.bin",FileMode.Create,FileAccess.Write, FileShare.None);
- formatter.Serialize(stream, myBlock);
- stream.Close();
對(duì)于對(duì)象的反序列化,則如下:
- IFormatter formatter = new BinaryFormatter();
- Stream stream = new FileStream("MyFile.bin",
- FileMode.Open,FileAccess.Read, FileShare.Read);
- MEABlock myBlock = (MEABlock) formatter.Deserialize(stream);
- stream.Close();
三、如何變相實(shí)現(xiàn)自定義可視化控件的.NET序列化和反序列化
對(duì)于WinForm中自定義控件,由于繼承于System.Windows.Form類(lèi),而Form類(lèi)又是從MarshalByRefObject繼承的,窗體本身無(wú)法做到序列化,窗體的實(shí)現(xiàn)基于Win32下GUI資源,不能脫離當(dāng)前上下文存在。
當(dāng)然可以采用變通的方法實(shí)現(xiàn)控件的序列化。這里采用的是記憶類(lèi)模型。定義記憶類(lèi)(其實(shí)就是一個(gè)可序列化的實(shí)體類(lèi))用于記錄控件的有效屬性,需要序列化控件的時(shí)候,只需要將該控件的實(shí)例Copy到記憶類(lèi),演變成序列化保存該記憶類(lèi)的操作。
.NET反序列化是一個(gè)逆過(guò)程。將數(shù)據(jù)流反序列化成為該記憶類(lèi),再根據(jù)該記憶類(lèi)的屬性生成控件實(shí)例。而對(duì)于控件的一些事件、方法則可以繼續(xù)使用。
.NET序列化和反序列化的基礎(chǔ)概念和簡(jiǎn)單的實(shí)現(xiàn)過(guò)程就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí).NET序列化和反序列化有所幫助。
【編輯推薦】



















