咱们都知道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编码使用的很广,
若是你们有兴趣的话,我在下一篇会详细描述,这里咱们先简单看一看。
好了,这一篇就说这些了,洗洗睡了。。。