下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
自定義序列化自定義序列化是控制某種類型的序列化和反序列化的過(guò)程。通過(guò)控制序列化,可以確保序列化的兼容性,即可以在某個(gè)類型的不同版本之間序列化和反序列化,而不會(huì)破壞該類型的核心功能。例如,在某個(gè)類型的第一個(gè)版本中,可能只有兩個(gè)字段。在某個(gè)類型的下一版本中,又增加了幾個(gè)字段。然而,應(yīng)用程序的第二版必須能夠?qū)@兩種類型進(jìn)行序列化和反序列化。以下各節(jié)描述如何控制序列化。在序列化期間和之后運(yùn)行自定義方法最佳做法也是最簡(jiǎn)單的方法(在.NetFramework2.0版中引入),就是在序列化期間和之后將下列屬性應(yīng)用于用于更正數(shù)據(jù)的方法:OnDeserializedAttributeOnDeserializingAttributeOnSerializedAttributeOnSerializingAttribute這些屬性使該類型可以參與序列化和反序列化過(guò)程的任何一個(gè)階段或全部四個(gè)階段。屬性指定在每個(gè)階段應(yīng)調(diào)用的該類型的方法。這些方法不會(huì)訪問(wèn)序列化流,而是允許您在序列化或反序列化之前和之后更改對(duì)象。屬性可以應(yīng)用于類型繼承層次結(jié)構(gòu)的所有級(jí)別,每種方法在層次結(jié)構(gòu)中從基礎(chǔ)到派生程度最大依次調(diào)用。此機(jī)制通過(guò)將序列化和反序列化的職責(zé)分配給派生程度最大的實(shí)現(xiàn),可以避免實(shí)現(xiàn)ISerializable接口的復(fù)雜性以及可能產(chǎn)生的任何問(wèn)題。此外,此機(jī)制還允許格式化程序忽略字段的填充以及從序列化流中的檢索。有關(guān)控制序列化和反序列化的詳細(xì)信息和示例,請(qǐng)單擊上面的任意鏈接。此外,在向現(xiàn)有可序列化類型中添加新字段時(shí),將OptionalFieldAttribute屬性應(yīng)用于該字段。在處理缺少新字段的流時(shí),BinaryFormatter和SoapFormatter將忽略該字段的不存在。實(shí)現(xiàn)ISerializable接口控制序列化的一種方式是在對(duì)象上實(shí)現(xiàn)ISerializable接口。但是應(yīng)注意,在控制序列化時(shí),上一節(jié)中的方法優(yōu)先于此方法。此外,對(duì)于用Serializable屬性標(biāo)記且在類級(jí)別上或其構(gòu)造函數(shù)上具有聲明性或命令性安全的類,不應(yīng)使用默認(rèn)序列化。相反,這些類應(yīng)始終實(shí)現(xiàn)ISerializable接口。實(shí)現(xiàn)ISerializable涉及實(shí)現(xiàn)GetObjectData方法以及在反序列化對(duì)象時(shí)使用的特殊構(gòu)造函數(shù)。以下示例代碼說(shuō)明如何對(duì)前面節(jié)中的MyObject類實(shí)現(xiàn)ISerializable。C# 復(fù)制代碼[Serializable]publicclassMyObject:ISerializable(publicintn1;publicintn2;publicStringstr;publicMyObject()(}
protectedMyObject(SerializationInfoinfo,StreamingContextcontext)(n1=info.GetInt32(〃i〃);n2=info.GetInt32(〃j〃);str=info.GetString(〃k〃);}[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)]publicvirtualvoidGetObjectData(SerializationInfoinfo,StreamingContextcontext)(info.AddValue(〃i〃,n1);info.AddValue(〃j〃,n2);info.AddValue(〃k〃,str);}}當(dāng)序列化期間調(diào)用GetObjectData時(shí),您負(fù)責(zé)填充由方法調(diào)用提供的SerializationInfo。只需將要被序列化的變量作為名稱/值對(duì)添加。任何文本都可用作該名稱。您可以自由決定將哪些成員變量添加到SerializationInfo中,前提是序列化了足夠多的數(shù)據(jù),可以在反序列化期間還原該對(duì)象。如果基對(duì)象實(shí)現(xiàn)了ISerializable,則派生類應(yīng)對(duì)該基對(duì)象調(diào)用GetObjectData方法。請(qǐng)注意,序列化可使其他代碼得以查看或修改本來(lái)不可訪問(wèn)的對(duì)象實(shí)例數(shù)據(jù)。因此,執(zhí)行序列化的代碼要求指定了SerializationFormatter標(biāo)志的SecurityPermission。在默認(rèn)策略下,通過(guò)Internet下載的代碼或Intranet代碼不會(huì)被授予該權(quán)限;只有本地計(jì)算機(jī)上的代碼才會(huì)被授予該權(quán)限。必須對(duì)GetObjectData方法進(jìn)行顯式保護(hù),方法是要求指定了SerializationFormatter標(biāo)志的SecurityPermission或要求其他專門(mén)保護(hù)私有數(shù)據(jù)的權(quán)限。如果私有字段中存儲(chǔ)了敏感信息,應(yīng)要求GetObjectData具有適當(dāng)權(quán)限,以保護(hù)數(shù)據(jù)。請(qǐng)記住,被授予指定了SerializationFormatter標(biāo)志的SecurityPermission的代碼可以查看和修改存儲(chǔ)在私有字段中的數(shù)據(jù)。被授予了此SecurityPermission的惡意調(diào)用方可以查看隱藏目錄位置或授予的權(quán)限等數(shù)據(jù),并使用這些數(shù)據(jù)攻擊計(jì)算機(jī)的安全漏洞。有關(guān)可以指定的安全權(quán)限標(biāo)志的完整列表,請(qǐng)參見(jiàn)SecurityPermissionFlag枚舉。有一點(diǎn)必須強(qiáng)調(diào),在向類中添加ISerializable時(shí),必須實(shí)現(xiàn)GetObjectData和特殊構(gòu)造函數(shù)。如果缺少GetObjectData,編譯器將發(fā)出警告。但是,由于無(wú)法強(qiáng)制實(shí)現(xiàn)構(gòu)造函數(shù),因此如果缺少構(gòu)造函數(shù),編譯器不會(huì)發(fā)出警告;并且當(dāng)試圖反序列化不帶構(gòu)造函數(shù)的類時(shí),會(huì)引發(fā)異常。當(dāng)前的設(shè)計(jì)優(yōu)于SetObjectData方法,可以解決潛在的安全性和版本控制問(wèn)題。例如,如果SetObjectData方法被定義為接口的一部分,則該方法必須是公共的;這樣,用戶必須編寫(xiě)代碼以防止多次調(diào)用SetObjectData方法。否則,在執(zhí)行操作的過(guò)程中,調(diào)用對(duì)象的SetObjectData方法的惡意應(yīng)用程序會(huì)導(dǎo)致潛在的問(wèn)題。在反序列化期間,使用為此目的提供的構(gòu)造函數(shù)將SerializationInfo傳遞給類。在反序列化對(duì)象時(shí),對(duì)構(gòu)造函數(shù)施加的任何可見(jiàn)性約束均被忽略,因此可以將類標(biāo)記為public、protected、internal或private。但是,如果類未被密封,則最好將構(gòu)造函數(shù)標(biāo)記為protected;如果類被密封了,則應(yīng)將構(gòu)造函數(shù)標(biāo)記為private。構(gòu)造函數(shù)還應(yīng)執(zhí)行徹底的輸入驗(yàn)證。為了避免惡意代碼的濫用,構(gòu)造函數(shù)應(yīng)強(qiáng)制使用任何其他構(gòu)造函數(shù)獲取類實(shí)例所需的
同樣的安全檢查和權(quán)限。如果不采用此建議,惡意代碼將可以預(yù)先序列化對(duì)象,通過(guò)指定了SerializationFormatter標(biāo)志的SecurityPermission獲得控制權(quán),然后在客戶端計(jì)算機(jī)上反序列化對(duì)象,避開(kāi)本來(lái)在標(biāo)準(zhǔn)實(shí)例構(gòu)造過(guò)程中會(huì)使用公共構(gòu)造函數(shù)應(yīng)用的任何安全性。要還原該對(duì)象的狀態(tài),只需使用在序列化期間使用的名稱從Serializationinfo檢索變量的值即可。如果基類實(shí)現(xiàn)ISerializable,則應(yīng)調(diào)用基構(gòu)造函數(shù)以允許基對(duì)象還原其變量。當(dāng)您從實(shí)現(xiàn)ISerializable的類中派生一個(gè)新類時(shí),派生類必須同時(shí)實(shí)現(xiàn)該構(gòu)造函數(shù)以及GetObjectData方法(如果派生類具有需要序列化的變量)。下面的代碼示例說(shuō)明如何使用前面所示的MyObject類做到這一點(diǎn)。C# 也復(fù)制代碼[Serializable]publicclassObjectTwo:MyObject(publicintnum;publicObjectTwo():base()(}protectedObjectTwo(Serializationinfosi,StreamingContextcontext):base(si,context)(num=si.Getint32(〃num〃);}[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)]publicoverridevoidGetObjectData(Serializationinfosi,StreamingContextcontext)(base.GetObjectData(si,context);si.AddValue(〃num〃,num);}}不要忘記在反序列化構(gòu)造函數(shù)中調(diào)用基類。如果沒(méi)有調(diào)用基類,將永遠(yuǎn)不會(huì)調(diào)用基類上的構(gòu)造函數(shù),并且在反序列化后該對(duì)象將不會(huì)被完全構(gòu)造。對(duì)象將被徹底重新構(gòu)造,并且在反序列化期間調(diào)用方法可能會(huì)產(chǎn)生不良的副作用,因?yàn)楸徽{(diào)用的方法可能引用在進(jìn)行此調(diào)用時(shí)尚未被反序列化的對(duì)象引用。如果反序列化的類實(shí)現(xiàn)IDese
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年秋九年級(jí)歷史上冊(cè) 第2單元 古代歐洲文明 第4課 希臘城邦和亞歷山大帝國(guó)教學(xué)實(shí)錄 新人教版
- 2024-2025學(xué)年新教材高中物理 第七章 3 萬(wàn)有引力理論的成就(1)教學(xué)實(shí)錄 新人教版必修2
- 2024七年級(jí)英語(yǔ)下冊(cè) Unit 8 Summer Holiday Is Coming Lesson 48 Li Ming's Summer Holiday教學(xué)實(shí)錄(新版)冀教版
- 個(gè)人求職信15篇
- 公司員工離職申請(qǐng)(15篇)
- 湖北省隨州市部分高中聯(lián)考協(xié)作體2024-2025學(xué)年高三上學(xué)期12月聯(lián)考生物試卷含答案
- 教師感恩的演講稿6篇
- 有關(guān)教育的名詞解釋
- 銀行結(jié)算賬戶管理辦法
- 關(guān)于小學(xué)學(xué)校工作總結(jié)范文錦集十篇
- 完整版成人教育計(jì)算機(jī)考試題目答案
- NB/T 10727-2021煤礦膏體充填開(kāi)采技術(shù)規(guī)范
- YY/T 0698.3-2009最終滅菌醫(yī)療器械包裝材料第3部分:紙袋(YY/T 0698.4所規(guī)定)、組合袋和卷材(YY/T 0698.5所規(guī)定)生產(chǎn)用紙要求和試驗(yàn)方法
- GB/T 28733-2012固體生物質(zhì)燃料全水分測(cè)定方法
- GB/T 16989-2013土工合成材料接頭/接縫寬條拉伸試驗(yàn)方法
- GB/T 1226-2017一般壓力表
- GA 1517-2018金銀珠寶營(yíng)業(yè)場(chǎng)所安全防范要求
- 掘進(jìn)工作面設(shè)計(jì)說(shuō)明書(shū)
- 評(píng)標(biāo)專家?guī)煜到y(tǒng)系統(tǒng)總體建設(shè)方案參考模板
- 頑固性高血壓的介入治療進(jìn)展課件
- 三年級(jí)上冊(cè)數(shù)學(xué)課件北師大版專項(xiàng)復(fù)習(xí) 操作題、圖形題專項(xiàng)
評(píng)論
0/150
提交評(píng)論