我们都知道 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 的
DataCo ntract 全部去掉。
是不是很简单,下面我们就要验证一下,看看这个F ormat 是否进入到了这个 Operation 的B ehavior 中,
从上面的图中,你也看到了, XmlSerializerFormat 已经被注入到 Behavior 中,并且是由类 XmlSerializerOperationBehavior代为处理。
接下来,我们用 fiddler 监视一下,看看 Message 中的 Body 是否真的按照 XmlSerializer 序列化了。
有没有看到,这次M essage 的B ody 已经和文章开头处的M essage 不一样了。
2. NetDataContract
这个玩意也没什么好说的,光从表面上看,它和 DataContract 唯一不同的地方就是多了一个 Net ,所以你大概也能猜到,这个功能大概和 DataCont
ract 一样, 只不过比 DataContract 多了一个程序集保存,那这句话是什么意思呢???就是 NetDataContract 会把程序集的命名空间 和类名都保存到 XSD 中,
在反序列化的过程中必须要用同样的程序集才能解开,其实不管我们是做 SOA 或者面向对象编程都讲究接口编 程,而 NetDataContract 给你的印象就 是面
向对象编程,当然这也有好处,比如说如果把程序集带进去就好像秘钥一样,必须有它才能解开, 对吧,所以导致 wcf 项目组并不对 NetDataContract 感冒
,所以在实际应用上也不建议使用。
3. DataContractJsonSerializer
看到上面这个带有 Json 的字样,我想大家都知道这玩意是干什么的???没错,他就是将我们的 Model 序列化成 Json ,这在 wcf 的 rest编码 使用的很广,
如果大家有兴趣的话, 我在下一篇会详细描述,这里我们先简单看一看。
好了,这一篇就说这些了,洗洗睡了。。。