我們都知道wcf是由通道棧組成的,在我們傳輸的引數走到傳輸通道層之前,先需要經過序列化的過程,也就是將引數序列化為message,這篇
我們就來說說這裡的序列化,蠻有意思的,可能初學者也明白,在wcf中預設的序列化是DataContractSerializer,確實是這樣,不過wcf在通道中
其實不僅僅支援DataContractSerializer,它還支持其他型別的序列化,比如XmlSerializer,NetDataContractSerializer以及DataContractJson
Serializer,下面我們一起來見證下。
1. XmlSerializer
要了解XmlSerializer,我們先來簡單看看NetDataContractSerializer,在前面的文章中,我也說過DataContract就是將我們的model序列化為
XSD,第二點就是使用DataContract的原則就是你必須在Model上加DataContract,而且在你要序列化的欄位上加DataMember。這樣才能夠正確的序列
化,為了演示,我們先看看預設的序列化Model會變成啥樣?
1 [DataContract] 2 public class Student 3 { 4 [DataMember] 5 public int ID { get; set; } 6 7 [DataMember] 8 public string Name { get; set; } 9 10 [DataMember] 11 public string SNS { get; set; } 12 }
但是在有些情況下,你可能並不適合用DataContract,比如Model是第三方提供的,那麼這個時候你的Model可能就不會有DataContract標記,那這樣的
話wcf就無法進行序列化,那我如果非要保證wcf能正常跑起來的話,還有其他好的辦法嗎???當然了,肯定有辦法,這就好比談戀愛一樣,總不能
在一棵樹上吊死吧,沒人誰離不開誰,也不會誰離開了誰會死,天涯何處無芳草,男兒何患無妻,對吧。Wcf中也一樣,既然DataContract用不了,自
然會有替代它的人,那這個人就是XmlSerializer,使用起來也很簡單,就是在契約方法上面加上XmlSerializerFormat即可,然後我們把Model的
DataContract全部去掉。
是不是很簡單,下面我們就要驗證一下,看看這個Format是否進入到了這個Operation的Behavior中,
從上面的圖中,你也看到了, XmlSerializerFormat 已經被注入到Behavior中,並且是由類XmlSerializerOperationBehavior代為處理。
接下來,我們用fiddler監視一下,看看Message中的Body是否真的按照XmlSerializer 序列化了。
有沒有看到,這次Message的Body已經和文章開頭處的Message不一樣了。
2. NetDataContract
這個玩意也沒什麼好說的,光從表面上看,它和DataContract唯一不同的地方就是多了一個Net,所以你大概也能猜到,這個功能大概和DataCont
ract一樣,只不過比DataContract多了一個程式集儲存,那這句話是什麼意思呢???就是NetDataContract會把程式集的名稱空間和類名都儲存到XSD中,
在反序列化的過程中必須要用同樣的程式集才能解開,其實不管我們是做SOA或者物件導向程式設計都講究介面編程,而NetDataContract給你的印象就是面
向物件程式設計,當然這也有好處,比如說如果把程式集帶進去就好像祕鑰一樣,必須有它才能解開,對吧,所以導致wcf專案組並不對NetDataContract感冒
,所以在實際應用上也不建議使用。
3. DataContractJsonSerializer
看到上面這個帶有Json的字樣,我想大家都知道這玩意是幹什麼的???沒錯,他就是將我們的Model序列化成Json,這在wcf的rest編碼使用的很廣,
如果大家有興趣的話,我在下一篇會詳細描述,這裡我們先簡單看一看。
好了,這一篇就說這些了,洗洗睡了。。。