.net的類型可以分為兩種:聲明類型和真實類型。我們提倡面向接口的程式設計,對象的真實類型往往需要在運作時才能确定,在程式設計的時候往往隻需要指明類型的聲明類型,比如類型實作的接口或者抽象類。當我們使用基于接口或者抽象類建立的datacontractserializer去序列化一個實作了該接口或者繼承該抽象類的執行個體的時候,往往會因為對對象的真實類型無法識别造成不能正常地序列化。
現在,我們定義兩個帶資料協定的類——actioninfo和actionparameterinfo:
在代碼中添加以下代碼填充實體類:
測試序列化:
生成的xml如下:
從xml看到:
datacontractserializer在預設的情況下采用了如下的序列化規則。
1、xml的根節點名稱為資料契約類型的名稱。
2、預設的命名空間采用的格式為 http://schemas.datacontract.org/2004/07/datacontractserializerdemo (資料契約類型的命名空間)。
3、隻有顯示地應用了datamemberattributue特性的字段或屬性才能作為資料成員參與序列化。
4、所有資料成員均以xml元素的形式被序列化。
5、序列化後資料成員在xml中的次序采用這樣的規則:父類資料成員在前,子類資料成員在後;定義在同一個類型中的資料成員按照字母排序。
如果預設序列化後的xml結構不能滿足我們的需求,則可以通過datacontractattribute和datamenmberattribute這兩個特性對其進行修正。在下面我們通過datacontractattribute特性設定了資料契約的名稱和命名空間,通過datamenmberattribute特性的name屬性為name和birthday兩個屬性設定不同于屬性名稱的資料成員名稱,并通過order控制資料成員的先後次序。
修改actionparameterinfo類:
再次序列化,xml結構如下:
有木有發現datamember中name與order的作用啊

小注:
對于一些比較複雜的類型無法序列化、反序列化(不能識别類型)的時候,就得考慮使用knowntypeattribute來标注可能涉及到的外部類型,但如果遇到像泛型這些較為複雜的類型,就要考慮在帶資料協定的類中添加一個靜态方法,該方法傳回type 的ienumerable,一般是type[]就可以了,而在knowntypeattribute的構造函數中使用這個方法的名字。
在該demo中将actioninfo修改為如下形式(即去掉static type[] getknowtypes()函數,直接辨別屬性類型)也是可以正常序列化反序列化的:
修改實體類後的序列化xml如下:
那可不可以去掉knowntype辨別呢?答案是不可以的。
那麼在actioninfo類中是否可以定義兩個已知類型呢?
經過測試驗證,不能再同一個類中定義兩個已知類型,比如:
同時在類上辨別:
錯誤資訊如下:
但是對于同一個類型,在一個類中可以有多個屬性,比如:
填充實體類代碼如下:
序列化之後的xml如下:
如果就是有多個複雜屬性如何處理呢?
铛铛==》
修改actioninfo類為:
填充實體的代碼如下:
序列化之後的結果為:
可見,可以通過多個knowntype辨別來實作同一個資料契約中多個複雜類型的序列化與反序列化。
此處是以兩個字典類型來驗證的,其實不管是list還是字典都可以通過:多個knowntype辨別來實作同一個資料契約中多個複雜類型的序列化與反序列化。
knowntype辨別類簡潔處理方式(這種方式不需要在類上辨別knowntype):
然後調用:
即可
datacontractjsonserializer的用法與datacontractserializer類似,隻是兩者對于實體類序列化後的存儲形式不一樣,僅此而已。
<a target="_blank" href="http://blog.csdn.net/jiankunking/article/details/48444973">c# wcf datacontractserializer 類</a>
小注:
如果序列化list<baseclass>即需要序列化一個由baseclass類及其子類組成的集合的時候,需要在子類基類上加上辨別:
在反序列化的時候,調用:
傳入子類基類的的type。
參考文章:
<a target="_blank" href="http://www.cnblogs.com/meteorseed/archive/2012/05/13/2477514.html">wcf學習筆記——對象序列化</a>
<a target="_blank" href="http://blog.csdn.net/tcjiaan/article/details/8198716">傳說中的wcf(6):資料協定(b)</a>
<a target="_blank" href="http://www.tuicool.com/articles/ujveyv">序列化和反序列化的幾種方式(datacontractserializer)(二)</a>
<a target="_blank" href="http://blog.chinaunix.net/uid-20777859-id-546350.html">關于複雜類型的序列化 </a>