WCF学习笔记之序列化
DataContractAttribute 與 DataMenberAttribute
?
DataContractAttribute該特性只能用于枚舉、類和結構體,而不能用于接口;又因為DataContractAttribute是不可以被繼承的,所以要所有作為數據契約的類型自身必須有這么一個特性;而且一個類型上只能有一個DataContractAttribute特性;(因為DataContractAttribute的AttributeUsage中AllowMultiple屬性為False);DataContractAttribute僅僅包含三個屬性成員;分別為Name(數據契約名稱)、Namespace(命名空間)、IsReference(表示在進行序列化的時候是否保持對象現有的結構,該屬性默認值為False);
?
DataMenberAttribute該特性只能應用在字段和屬性上;其有四個屬性:分別為Name(數據成員的名稱,默認為字段或屬性的名稱)、Order(相應的數據成員在最終序列化的XML中出現的位置,Order值越小越靠前默認值為-1)、IsRequired(表明屬性成員是否是必需的成員,默認值為false)、EmitDefaultValue(表明在數據成員的值等級于默認值的情況下,是否還需要將其序列化到最終的XML中,默認值為true;表示默認值會參與序列化)
?
數據契約和數據成員序列化只跟是否應用的DataContractAttribute 與 DataMenberAttribute特性有關;與類型或成員的限制修飾符無關(public,private等);DataContractSerializer具有一個只讀的MaxItemsInObjectGraph屬性表示允許被序列化或反序列化對象的數量上限(可以防止黑客通過生成大容量的數據頻繁地對服務器發送請求,最終導致服務器不堪重負而崩潰);[P180]
?
已知類型
由于托管對象的結構是通過CLR類型來描述,所以DataContractAttribute在進行序列化的時候必須先確定所有對象的真實類型;NET的類型可以分為聲明類型和真實類型兩種;比如類型實現的接口或抽象類,當我們使用基于接口或抽象類創建的DataContractAttribute去序列化一個實現了該接口或繼承該抽象類的實例時,往往會因為無法識別對象的真實類型造成不能正常序列化;方法一:可以在數據契約中聲明其類型[KnowType(typeof(類型))];方法二:可以采用配置[P189];方法三:可以采用ServiceKnownTypeAttribute特性;[P191]
?
轉載于:https://www.cnblogs.com/wujy/p/3188512.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的WCF学习笔记之序列化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux培训笔记1
- 下一篇: 转载[POJ题型分类]