咱們都知道wcf是由信道棧組成的,在咱們傳輸的參數走到傳輸信道層以前,先須要通過序列化的過程,也就是將參數序列化爲message,這篇編程
咱們就來講說這裏的序列化,蠻有意思的,可能初學者也明白,在wcf中默認的序列化是DataContractSerializer,確實是這樣,不過wcf在信道中編碼
其實不只僅支持DataContractSerializer,它還支持其他類型的序列化,好比XmlSerializer,NetDataContractSerializer以及DataContractJsonspa
Serializer,下面咱們一塊兒來見證下。rest
1. XmlSerializercode
要了解XmlSerializer,咱們先來簡單看看NetDataContractSerializer,在前面的文章中,我也說過DataContract就是將咱們的model序列化爲orm
XSD,第二點就是使用DataContract的原則就是你必須在Model上加DataContract,並且在你要序列化的字段上加DataMember。這樣纔可以正確的序列對象
化,爲了演示,咱們先看看默認的序列化Model會變成啥樣?blog
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能正常跑起來的話,還有其餘好的辦法嗎???固然了,確定有辦法,這就比如談戀愛同樣,總不能get
在一棵樹上吊死吧,沒人誰離不開誰,也不會誰離開了誰會死,天涯何處無芳草,男兒何患無妻,對吧。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編碼使用的很廣,
若是你們有興趣的話,我在下一篇會詳細描述,這裏咱們先簡單看一看。
好了,這一篇就說這些了,洗洗睡了。。。