c#.net實(shí)體類序列化的實(shí)現(xiàn)方法

本篇內(nèi)容介紹了“c#.net實(shí)體類序列化的實(shí)現(xiàn)方法”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

在青云譜等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站制作,青云譜網(wǎng)站建設(shè)費(fèi)用合理。

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

1.什么是序列化

序列化是將對(duì)象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)母袷降倪^程,在序列化過程中,對(duì)象的公共字段和私有字段以及類的名稱(包括包含該類的程序集)都被轉(zhuǎn)換為字節(jié)流,然后寫入數(shù)據(jù)流。與序列化相對(duì)的是反序列化,它將流轉(zhuǎn)換為對(duì)象。這兩個(gè)過程結(jié)合起來,可以輕松地存儲(chǔ)和傳輸數(shù)據(jù)。

2.為什么使用序列化

a. 一個(gè)原因是將對(duì)象的狀態(tài)保持在存儲(chǔ)媒體中,以便可以在以后重新創(chuàng)建精確的副本。

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

b.另一個(gè)原因是通過值將對(duì)象從一個(gè)應(yīng)用程序域發(fā)送到另一個(gè)應(yīng)用程序域中。

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

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

當(dāng)反序列化已序列化的類時(shí),將重新創(chuàng)建該類,并自動(dòng)還原所有數(shù)據(jù)成員的值。

3.如何實(shí)現(xiàn)對(duì)象的序列化及反序列化

要實(shí)現(xiàn)對(duì)象的序列化,首先要保證該對(duì)象可以序列化。而且,序列化只是將對(duì)象的屬性進(jìn)行有效的保存,對(duì)于對(duì)象的一些方法則無法實(shí)現(xiàn)序列化的。

實(shí)現(xiàn)一個(gè)類可序列化的最簡(jiǎn)便的方法就是增加Serializable屬性標(biāo)記類。如:

[Serializable()]  public class MEABlock  {  private int m_ID;  public string Caption;  public MEABlock()  {  ///構(gòu)造函數(shù)  }  }

即可實(shí)現(xiàn)該類的可序列化。注意序列化的類必須為Public,否則不能夠被序列化。

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

a .XML序列化

使用 XmLSerializer 類,可將下列項(xiàng)序列化。

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

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

XmlElement 對(duì)象。

XmlNode 對(duì)象。

DataSet 對(duì)象。

要實(shí)現(xiàn)上述類的實(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文件格式如下:

<MEABlock> <Caption>Test</Caption> </MEABlock>

對(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)

b. 二進(jìn)制序列化

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

要實(shí)現(xiàn)上述類的實(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();

4、如何變相實(shí)現(xiàn)自定義可視化控件的序列化、反序列化

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

當(dāng)然可以采用變通的方法實(shí)現(xiàn)控件的序列化。這里采用的是記憶類模型。

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

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

wwf之所以強(qiáng)調(diào)要把類實(shí)例化,就是因?yàn)楣ぷ髁骱蛻?yīng)用程序是在不同的線程中。二者之間需要用類作為傳遞數(shù)據(jù)的載體的話,就需要把該類定義為public序列化為二進(jìn)制。

“c#.net實(shí)體類序列化的實(shí)現(xiàn)方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

文章題目:c#.net實(shí)體類序列化的實(shí)現(xiàn)方法
轉(zhuǎn)載來源:http://www.muchs.cn/article32/iheipc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、定制網(wǎng)站、電子商務(wù)、域名注冊(cè)動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)