c#net實(shí)體類序列化方法_第1頁
c#net實(shí)體類序列化方法_第2頁
c#net實(shí)體類序列化方法_第3頁
c#net實(shí)體類序列化方法_第4頁
c#net實(shí)體類序列化方法_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

c#.net實(shí)體類序列化方法2011-06-0115:45佚名互聯(lián)網(wǎng)我要評(píng)論(0)字號(hào):T|工,收藏序列化是將對(duì)象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)母袷降倪^程,在序列化過程中,對(duì)象的公共字段和私有字段以及類的名稱(包括包含該類的程序集)都被轉(zhuǎn)換為字節(jié)流,然后寫入數(shù)據(jù)流。與序列化相對(duì)的是反序列化,它將流轉(zhuǎn)換為對(duì)象。本文主要介紹實(shí)體類序列化,一起來看。AD:提到為了傳遞數(shù)據(jù),需要把作為載體的實(shí)體類序列化,好好的找了一些序列化方面的介紹。感覺下面的這個(gè)介紹比較容易介紹!什么是序列化序列化是將對(duì)象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)母袷降倪^程,在序列化過程中,對(duì)象的公共字段和私有字段以及類的名稱(包括包含該類的程序集)都被轉(zhuǎn)換為字節(jié)流,然后寫入數(shù)據(jù)流。與序列化相對(duì)的是反序列化,它將流轉(zhuǎn)換為對(duì)象。這兩個(gè)過程結(jié)合起來,可以輕松地存儲(chǔ)和傳輸數(shù)據(jù)。為什么使用序列化一個(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)的快捷方法。另一個(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ù)成員的值。如何實(shí)現(xiàn)對(duì)象的序列化及反序列化要實(shí)現(xiàn)對(duì)象的序列化,首先要保證該對(duì)象可以序列化。而且,序列化只是將對(duì)象的屬性進(jìn)行有效的保存,對(duì)于對(duì)象的一些方法則無法實(shí)現(xiàn)序列化的。實(shí)現(xiàn)一個(gè)類可序列化的最簡便的方法就是增加Serializable屬性標(biāo)記類。如:[Serializable()]publicclassMEABlockTOC\o"1-5"\h\z{privateintm_ID;publicstringCaption;publicMEABlock(){///構(gòu)造函數(shù)}}即可實(shí)現(xiàn)該類的可序列化。注意序列化的類必須為Public,否則不能夠被序列化。要將該類的實(shí)例序列化為到文件中?.NETFramework提供了兩種方法:a.XML序列化使用XmLSerializer類,可將下列項(xiàng)序列化。公共類的公共讀/寫屬性和字段實(shí)現(xiàn)ICollection或IEnumerable的類。(注意只有集合會(huì)被序列化,而公共屬性卻不會(huì)。)XmlElement對(duì)象。XmlNode對(duì)象。DataSet對(duì)象。要實(shí)現(xiàn)上述類的實(shí)例的序列化,可參照如下例子:MEABlockmyBlock=newMEABlock();//Insertcodetosetpropertiesandfieldsoftheobject.XmlSerializermySerializer=newXmlSerializer(typeof(MEABlock));//Towritetoafile,createaStreamWriterobject.StreamWritermyWriter=newStreamWriter("myFileName.xml");mySerializer.Serialize(myWriter,MEABlock);需要注意的是XML序列化只會(huì)將public的字段保存,對(duì)于私有字段不予于保存。生成的XML文件格式如下:<MEABlock><Caption>Test</Caption></MEABlock>對(duì)于對(duì)象的反序列化,則如下:MEABlockmyBlock;//ConstructsaninstanceoftheXmlSerializerwiththetype//ofobjectthatisbeingdeserialized.XmlSerializermySerializer=newXmlSerializer(typeof(MEABlock));//Toreadthefile,createsaFileStream.FileStreammyFileStream=newFileStream("myFileName.xml",FileMode.Open);//CallstheDeserializemethodandcaststotheobjecttype.myBlock=(MEABlock)mySerializer.Deserialize(myFileStream)b.二進(jìn)制序列化與XML序列化不同的是,二進(jìn)制序列化可以將類的實(shí)例中所有字段(包括私有和公有)都進(jìn)行序列化操作。這就更方便、更準(zhǔn)確的還原了對(duì)象的副本。要實(shí)現(xiàn)上述類的實(shí)例的序列化,可參照如下例子:MEABlockmyBlock=newMEABlock();//Insertcodetosetpropertiesandfieldsoftheobject.IFormatterformatter=newBinaryFormatter();Streamstream=newFileStream("MyFile.bin",FileMode.Create,FileAccess.Write,FileShare.None);formatter.Serialize(stream,myBlock);stream.Close();對(duì)于對(duì)象的反序列化,則如下:IFormatterformatter=newBinaryFormatter();Streamstream=newFileStream("MyFile.bin",FileMode.Open,FileAccess.Read,FileShare.Read);MEABlockmyBlock=(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)制。對(duì)象的序列化和反序列化2011-06-0115:05阿蜜果博客園我要評(píng)論(0)字號(hào):T|T收藏把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過程稱為對(duì)象的序列化。把字節(jié)序列恢復(fù)為Java對(duì)象的過程稱為對(duì)象的反序列化。本文主要介紹對(duì)象的序列化和反序列化,希望對(duì)你有幫助,一起來看。AD:當(dāng)兩個(gè)進(jìn)程在進(jìn)行遠(yuǎn)程通信時(shí),彼此可以發(fā)送各種類型的數(shù)據(jù)。無論是何種類型的數(shù)據(jù),都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個(gè)Java對(duì)象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為Java對(duì)象。把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過程稱為對(duì)象的序列化。把字節(jié)序列恢復(fù)為Java對(duì)象的過程稱為對(duì)象的反序列化。對(duì)象的序列化主要有兩種用途:把對(duì)象的字節(jié)序列永久地保存到硬盤上,通常存放在一個(gè)文件中;在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列。JDK類庫中的序列化APIjava.io.ObjectOutputStream代表對(duì)象輸出流,它的writeObject(Objectobj)方法可對(duì)參數(shù)指定的obj對(duì)象進(jìn)行序列化,把得到的字節(jié)序列寫到一個(gè)目標(biāo)輸出流中。java.io.ObjectInputStream代表對(duì)象輸入流,它的readObject()方法從一個(gè)源輸入流中讀取字節(jié)序列,再把它們反序列化為一個(gè)對(duì)象,并將其返回。只有實(shí)現(xiàn)了Serializable和Externalizable接口的類的對(duì)象才能被序列化。Externalizable接口繼承自Serializable接口,實(shí)現(xiàn)Externalizable接口的類完全由自身來控制序列化的行為,而僅實(shí)現(xiàn)Serializable接口的類可以采用默認(rèn)的序列化方式。對(duì)象序列化包括如下步驟:創(chuàng)建一個(gè)對(duì)象輸出流,它可以包裝一個(gè)其他類型的目標(biāo)輸出流,如文件輸出流;通過對(duì)象輸出流的writeObject()方法寫對(duì)象。對(duì)象反序列化的步驟如下:創(chuàng)建一個(gè)對(duì)象輸入流,它可以包裝一個(gè)其他類型的源輸入流,如文件輸入流;通過對(duì)象輸入流的readObject()方法讀取對(duì)象。下面讓我們來看一個(gè)對(duì)應(yīng)的例子,類的內(nèi)容如下:importjava.io.*;importjava.util.Date;/***對(duì)象的序列化和反序列化測試類.*@author<ahref="mailto:xiexingxing1121@126.com">AmigoXie</a>

*@version1.0*Creationdate:2007-9-15-下午21:45:48*/publicclassObjectSaver{/**11.*@paramargs12.13.@author<ahref="mailto:xiexingxing1121@126.com">AmigoXie</a>Creationdate:2007-9-15-下午21:45:3714.*/15.publicstaticvoidmain(String[]args)throwsException{16.ObjectOutputStreamout=newObjectOutputStream17.18.(newFileOutputStream("D:""objectFile.obj"));//序列化對(duì)象19.Customercustomer=newCustomer(11.*@paramargs12.13.@author<ahref="mailto:xiexingxing1121@126.com">AmigoXie</a>Creationdate:2007-9-15-下午21:45:3714.*/15.publicstaticvoidmain(String[]args)throwsException{16.ObjectOutputStreamout=newObjectOutputStream17.18.(newFileOutputStream("D:""objectFile.obj"));//序列化對(duì)象19.Customercustomer=newCustomer("阿蜜果",24);20.out.writeObject("你好!");21.out.writeObject(newDate());22.23.out.writeObject(customer);out.writeInt(123);//寫入基本類型數(shù)據(jù)24.25.out.close();//反序列化對(duì)象26.ObjectInputStreamin=newObjectInputStream27.(newFileInputStream("D:""objectFile.obj"));28.System.out.println("obj1="+(String)in.readObject());29.System.out.println("obj2="+(Date)in.readObject());30.Customerobj3=(Customer)in.readObject();31.32.System.out.println("obj3="intobj4=in.readInt();+obj3);33.System.out.println("obj4="+obj4);34.in.close();35.36.37.classCustomerimplementsSerializable{37.privateStringname;privateintage;publicCustomer(Stringname,intage){=name;this.age=age;}publicStringtoString(){age="+age;return"name="+name+age="+age;}}輸出結(jié)果如下:obj1=你好!obj2=SatSep1522:02:21CST2007obj3=name=阿蜜果,age=24obj4=123因此例比較簡單,在此不再詳述。實(shí)現(xiàn)Serializable接口ObjectOutputStream只能對(duì)Serializable接口的類的對(duì)象進(jìn)行序列化。默認(rèn)情況下,ObjectOutputStream按照默認(rèn)方式序列化,這種序列化方式僅僅對(duì)對(duì)象的非transient的實(shí)例變量進(jìn)行序列化,而不會(huì)序列化對(duì)象的transient的實(shí)例變量,也不會(huì)序列化靜態(tài)變量。當(dāng)ObjectOutputStream按照默認(rèn)方式反序列化時(shí),具有如下特點(diǎn):如果在內(nèi)存中對(duì)象所屬的類還沒有被加載,那么會(huì)先加載并初始化這個(gè)類。如果在classpath中不存在相應(yīng)的類文件,那么會(huì)拋出ClassNotFoundException;在反序列化時(shí)不會(huì)調(diào)用類的任何構(gòu)造方法。如果用戶希望控制類的序列化方式,可以在可序列化類中提供以下形式的writeObject()和readObject()方法。privatevoidwriteObject(java.io.ObjectOutputStreamout)throwsIOExceptionprivatevoidreadObject(java.io.ObjectInputStreamin)throwsIOException,ClassNotFoundException;當(dāng)ObjectOutputStream對(duì)一個(gè)Customer對(duì)象進(jìn)行序列化時(shí),如果該對(duì)象具有writeObject()方法,那么就會(huì)執(zhí)行這一方法,否則就按默認(rèn)方式序列化。在該對(duì)象的writeObjectt()方法中,可以先調(diào)用ObjectOutputStream的defaultWriteObject()方法,使得對(duì)象輸出流先執(zhí)行默認(rèn)的序列化操作。同理可得出反序列化的情況,不過這次是defaultReadObject()方法。有些對(duì)象中包含一些敏感信息,這些信息不宜對(duì)外公開。如果按照默認(rèn)方式對(duì)它們序列化,那么它們的序列化數(shù)據(jù)在網(wǎng)絡(luò)上傳輸時(shí),可能會(huì)被不法份子竊取。對(duì)于這類信息,可以對(duì)它們進(jìn)行加密后再序列化,在反序列化時(shí)則需要解密,再恢復(fù)為原來的信息。默認(rèn)的序列化方式會(huì)序列化整個(gè)對(duì)象圖,這需要遞歸遍歷對(duì)象圖。如果對(duì)象圖很復(fù)雜,遞歸遍歷操作需要消耗很多的空間和時(shí)間,它的內(nèi)部數(shù)據(jù)結(jié)構(gòu)為雙向列表。在應(yīng)用時(shí),如果對(duì)某些成員變量都改為transient類型,將節(jié)省空間和時(shí)間,提高序列化的性能。實(shí)現(xiàn)Externalizable接口Externalizable接口繼承自Serializable接口,如果一個(gè)類實(shí)現(xiàn)了Externalizable接口,那么將完全由這個(gè)類控制自身的序列化行為。Externalizable接口聲明了兩個(gè)方法:publicvoidwriteExternal(ObjectOutputout)throwslOExceptionpublicvoidreadExternal(ObjectInputin)throwslOException,ClassNotFoundException前者負(fù)責(zé)序列化操作,后者負(fù)責(zé)反序列化操作。在對(duì)實(shí)現(xiàn)了Externalizable接口的類的對(duì)象進(jìn)行反序列化時(shí),會(huì)先調(diào)用類的不帶參數(shù)的構(gòu)造方法,這是有別于默認(rèn)反序列方式的。如果把類的不帶參數(shù)的構(gòu)造方法刪除,或者把該構(gòu)造方法的訪問權(quán)限設(shè)置為private、默認(rèn)或protected級(jí)別,會(huì)拋出java.io.InvalidException:novalidconstructor異常??尚蛄谢惖牟煌姹镜男蛄谢嫒菪苑彩菍?shí)現(xiàn)Serializable接口的類都有一個(gè)表示序列化版本標(biāo)識(shí)符的靜態(tài)變量:1.privatestaticfinallongserialVersionUID;以上serialVersionUID的取值是Java運(yùn)行時(shí)環(huán)境根據(jù)類的內(nèi)部細(xì)節(jié)自動(dòng)生成的。如果對(duì)類的源代碼作了修改,再重新編譯,新生成的類文件的serialVersionUID的取值有可能也會(huì)發(fā)生變化。類的serialVersionUID的默認(rèn)值完全依賴于Java編譯器的實(shí)現(xiàn),對(duì)于同一個(gè)類,用不同的Java編譯器編譯,有可能會(huì)導(dǎo)致不同的serialVersionUID,也有可能相同。為了提高哦啊serialVersionUID的獨(dú)立性和確定性,強(qiáng)烈建議在一個(gè)可序列化類中顯示的定義serialVersionUID,為它賦予明確的值。顯式地定義serialVersionUID有兩種用途:1)在某些場合,希望類的不同版本對(duì)序列化兼容,因此需要確保類的不同版本具有相同的serialVersionUID;2)在某些場合,不希望類的不同版本對(duì)序列化兼容,因此需要確保類的不同版本具有不同的serialVersionUIDo談?wù)勑蛄谢P(guān)于.net中的二進(jìn)制序列化和xml序列化2011-06-0114:26佚名17fx.Net我要評(píng)論(0)字號(hào):T|T收藏序列化是將對(duì)象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)母袷降倪^程。與序列化相對(duì)的是反序列化,它將流轉(zhuǎn)換為對(duì)象。這兩個(gè)過程結(jié)合起來,可以輕松地存儲(chǔ)和傳輸數(shù)據(jù)。本文主要介紹.NET中的二進(jìn)制序列化和XML序列化。AD:序列化技術(shù),就是將對(duì)象持久存儲(chǔ)。可以這樣理解:序列化就是將對(duì)象占用的內(nèi)存的數(shù)據(jù)copy到持久存儲(chǔ)設(shè)備,比如硬盤。序列化有什么用呢?兩點(diǎn)作用:1、持久的存儲(chǔ)對(duì)象狀態(tài);2、分布式運(yùn)算中傳遞數(shù)據(jù)的底層實(shí)現(xiàn)。.Net框架封裝的序列化技術(shù)包含兩種,即二進(jìn)制序列化和xml序列化(以下代碼都要求被序列化的對(duì)象的類型使用Serializable特征類)二進(jìn)制序列化的實(shí)現(xiàn)(usingSystem.Runtime.Serialization.Formatters.Binary;)序列化代碼://打開文件流FileStreamfs=newFileStream(保存序歹?;瘮?shù)據(jù)的文件路徑,F(xiàn)ileMode.OpenOrCreate);//創(chuàng)建二進(jìn)制序列化對(duì)象BinaryFormatterbf=newBinaryFormatter();//調(diào)用二進(jìn)制序列化對(duì)象的序列化方法執(zhí)行序列化操作bf.Serialize(fs,被序歹。化的對(duì)象);//關(guān)閉文件流fs.Close();反序列化代碼://打開文件流FileStreamfs=newFileStream(保存序歹?;瘮?shù)據(jù)的文件路徑,F(xiàn)ileMode.OpenOrCreate);//創(chuàng)建二進(jìn)制序列化對(duì)象BinaryFormatterbf=newBinaryFormatter();//調(diào)用二進(jìn)制序列化對(duì)象的反序列化方法執(zhí)行反序列化操作從文件中反序列化得到的對(duì)象=bf.Deserialize(fs)as被序列化對(duì)象的類型;//關(guān)閉文件流fs.Close();XML序列化的實(shí)現(xiàn)(usingSystem.Xml.Serialization;)序列化代碼://打開文件流FileStreamfs=newFileStream(保存序歹。化數(shù)據(jù)的文件路徑,F(xiàn)ileMode.OpenOrCreate);//創(chuàng)建XML序列化對(duì)象XmlSerializerxs=newXmlSerializer(typeof(被序歹?;瘜?duì)象的類型));//調(diào)用XML序列化對(duì)象的序列化方法執(zhí)行序列化操作xs.Serialize(fs,被序歹?;膶?duì)象);//關(guān)閉文件流fs.Close();反序列化代碼://打開文件流FileStreamfs=newFileStream(保存序歹。化數(shù)據(jù)的文件路徑,F(xiàn)ileMode.OpenOrCreate);//創(chuàng)建XML序列化對(duì)象XmlSerializerxs=newXmlSerializer(typeof(被序歹?;瘜?duì)象的類型));//調(diào)用XML序列化對(duì)象的反序列化方法執(zhí)行反序列化操作從文件中反序列化得到的對(duì)象=xs.Deserialize(fs)as被序列化對(duì)象的類型;//關(guān)閉文件流fs.Close();當(dāng)然這里所提供的是序列化和反序列化的默認(rèn)實(shí)現(xiàn),能應(yīng)付大多數(shù)運(yùn)用。特殊情況可以還需要重寫序列化的默認(rèn)實(shí)現(xiàn)。MSDN里面也有較詳細(xì)的示例代碼。深入C#序列化(Serialize)、反序列化

(Deserialize)(1)2011-06-0114:50望穿秋水博客園我要評(píng)論(0)字號(hào):T|!.本文主要介紹了C#中的序列化和反序列化,序列化是.NET運(yùn)行時(shí)環(huán)境用來支持用戶定義類型的流化的機(jī)制,希望對(duì)你有幫助,一起來看吧。AD:序列化又稱串行化,是.NET運(yùn)行時(shí)環(huán)境用來支持用戶定義類型的流化的機(jī)制。其目的是以某種存儲(chǔ)形成使自定義對(duì)象持久化,或者將這種對(duì)象從一個(gè)地方傳輸?shù)搅硪粋€(gè)地方。.NET框架提供了兩種串行化的方式:1、是使用BinaryFormatter進(jìn)行串行化;2、使用SoapFormatter進(jìn)行串行化;3、使用XmlSerializer進(jìn)行串行化。第一種方式提供了一個(gè)簡單的二進(jìn)制數(shù)據(jù)流以及某些附加的類型信息,而第二種將數(shù)據(jù)流格式化為XML存儲(chǔ);第三種其實(shí)和第二種差不多也是XML的格式存儲(chǔ),只不過比第二種的XML格式要簡化很多(去掉了SOAP特有的額外信息)。可以使用[Serializable]屬性將類標(biāo)志為可序列化的。如果某個(gè)類的元素不想被序列化,1、2可以使用[NonSerialized]屬性來標(biāo)志,2、可以使用[XmlIgnore]來標(biāo)志。1、使用BinaryFormatter進(jìn)行串行化下面是一個(gè)可串行化的類:usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;usingSystem.Web.UI.HtmlControls;usingSystem.IO;usingSystem.Runtime.Serialization.Formatters.Binary;/**////<summary>///ClassToSerialize的摘要說明///</summary>[Serializable]publicclassClassToSerialize{publicintid=100;publicstringname="Name";[NonSerialized]publicstringSex="男";}下面是串行化和反串行化的方法:publicvoidSerializeNow(){ClassToSerializec=newClassToSerialize();FileStreamfileStream=newFileStream("c:\\temp.dat",FileMode.Create);BinaryFormatterb=newBinaryFormatter();b.Serialize(fileStream,c);fileStream.Close();}publicvoidDeSerializeNow(){ClassToSerializec=newClassToSerialize();c.Sex="kkkk";FileStreamfileStream=newFileStream("c:\\temp.dat",FileMode.Open,FileAccess.Read,FileShare.Read);BinaryFormatterb=newBinaryFormatter();c=b.Deserialize(fileStream)asClassToSerialize;Response.Write();Response.Write(c.Sex);fileStream.Close();}調(diào)用上述兩個(gè)方法就可以看到串行化的結(jié)果:Sex屬性因?yàn)楸粯?biāo)志為[NonSerialized],故其值總是為null。2、使用SoapFormatter進(jìn)行串行化和BinaryFormatter類似,我們只需要做一下簡單修改即可:將using語句中的.Formatter.Binary改^.Formatter.Soap;將所有的BinaryFormatter替換為SoapFormatter.確保報(bào)存文件的擴(kuò)展名為.xml經(jīng)過上面簡單改動(dòng),即可實(shí)現(xiàn)SoapFormatter的串行化,這時(shí)候產(chǎn)生的文件就是一個(gè)xml格式的文件。3、使用XmlSerializer進(jìn)行串行化關(guān)于格式化器還有一個(gè)問題,假設(shè)我們需要XML,但是不想要SOAP特有的額外信息,那么我們應(yīng)該怎么辦呢?有兩中方案:要么編寫一個(gè)實(shí)現(xiàn)IFormatter接口的類,采用的方式類似于SoapFormatter類,但是沒有你不需要的信息;要么使用庫類XmlSerializer,這個(gè)類不使用Serializable屬性,但是它提供了類似的功能。如果我們不想使用主流的串行化機(jī)制,而想使用XmlSeralizer進(jìn)行串行化我們需要做一下修改:添加System.Xml.Serialization命名空間。Serializable和NoSerialized屬性將被忽略,而是使用XmlIgnore屬性,它的行為與NoSerialized類似。XmlSeralizer要求類有個(gè)默認(rèn)的構(gòu)造器,這個(gè)條件可能已經(jīng)滿足了。下面看示例:要序列化的類:usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;usingSystem.Web.UI.HtmlControls;usingSystem.Xml.Serialization;[Serializable]publicclassPerson{privatestringname;publicstringName{get{returnname;}set{name=value;}}publicstringSex;publicintAge=31;publicCourse[]Courses;publicPerson()TOC\o"1-5"\h\z{}26.publicPerson(stringName){name=Name;Sex="男";}}[Serializable]publicclassCourse{publicstringName;[XmlIgnore]publicstringDescription;publicCourse(){}publicCourse(stringname,stringdescription){Name=name;Description=description;TOC\o"1-5"\h\z}}序列化和反序列化方法:publicvoidXMLSerialize(){Personc=newPerson("cyj");c.Courses=newCourse[2];c.Courses[0]=newCourse("英語","交流工具");c.Courses[1]=newCourse("數(shù)學(xué)","自然科學(xué)");XmlSerializerxs=newXmlSerializer(typeof(Person));Streamstream=newFileStream("c:\\cyj.XML",FileMode.Create,FileAccess.Write,FileShare.Read);xs.Serialize(stream,c);stream.Close();}publicvoidXMLDeserialize(){XmlSerializerxs=newXmlSerializer(typeof(Person));Streamstream=newFileStream("C:\\cyj.XML",FileMode.Open,FileAccess.Read,FileShare.Read);Personp=xs.Deserialize(stream)asPerson;Response.Write(p.Name);Response.Write(p.Age.ToString());Response.Write(p.Courses[0].Name);Response.Write(p.Courses[0].Description);Response.Write(p.Courses[1].Name);Response.Write(p.Courses[1].Description);stream.Close();}這里Course類的Description屬性值將始終為null,生成的xml文檔中也沒有該節(jié)點(diǎn),如下:<?xmlversion="1.0"?>〈Personxmlns:xsi="/2001/XMLSchema-instance"xmlns:xsd="/2001/XMLSchema"><Sex>M</Sex><Age>31</Age><Courses><Course><Name>英語</Name><Description>交流工具</Description〉</Course><Course><Name>數(shù)學(xué)</Name><Description>自然科學(xué)</Description)</Course></Courses><Name>cyj</Name></Person>4、自定義序列化如果你希望讓用戶對(duì)類進(jìn)行串行化,但是對(duì)數(shù)據(jù)流的組織方式不完全滿意,那么可以通過在自定義類中實(shí)現(xiàn)接口來自定義串行化行為。這個(gè)接口只有一個(gè)方法,GetObjectData.這個(gè)方法用于將對(duì)類對(duì)象進(jìn)行串行化所需要的數(shù)據(jù)填進(jìn)SerializationInfo對(duì)象。你使用的格式化器將構(gòu)造SerializationInfo對(duì)象,然后在串行化時(shí)調(diào)用GetObjectData.如果類的父類也實(shí)現(xiàn)了ISerializable,那么應(yīng)該調(diào)用GetObjectData的父類實(shí)現(xiàn)。如果你實(shí)現(xiàn)了ISerializable,那么還必須提供一個(gè)具有特定原型的構(gòu)造器,這個(gè)構(gòu)造器的參數(shù)列表必須與GetObjectData相同。這個(gè)構(gòu)造器應(yīng)該被聲明為私有的或受保護(hù)的,以防止粗心的開發(fā)人員直接使用它。示例如下:實(shí)現(xiàn)ISerializable的類:usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;usingSystem.Web.UI.HtmlControls;usingSystem.Runtime.Serialization;usi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論