在第二章"契约",我们讨论了使用DataContract序列化器在客户端和服务端之间将CLR类型转换成基于标准的XML的序列化。然而有很多 场景并不适合使用DataContract序列化器。这包括不支持DataContract序列化器的对已存在的CLR类型的序列化,原有的Web 服务,交互系统,代码合并(比如.NET Remoting)和数据形状。数据形状是指控制一个用来性能优化和契约优先开发的序列化成XML的.NET类型的过程。在这些情况下,了解如何使用 WCF和.NET Framework提供的序列化工具是很重要的。
编码是另外一个与序列化相关的重要主题。WCF在对象序列化和将消息转换成可以使用一个传输协议发送的字节间做了很多区别。
序列化VS编码
在WCF中序列化和编码间有很多重要的不同。WCF世界中的序列化规则和编码与其他分布式计算技术(比如ASP.NET Web 服务和COM)有稍微不同。
序列化是通常用来描述将一个对象结构转换成一个字节数组过程的规则。这对于表达对象的状态非常有用。序列化可以用来将一个对象的状态持续保存到一个文件或 者一个数据库中,拷贝一个对象到粘贴板,或者通过网络将对象传递给其他应用程序。但WCF与序列化的标准定义不同。WCF定义序列化作为将一个对象结构转 换成一个XML信息集(XML Infoset)的过程.这个定义不是新近提出的,因为ASP.NET Web 服务也采用同样的规范。XML信息集是WCF内部用来表示一条消息的数据模型。 System.ServiceModel.Channels.Message类是一段XML信息集的表示。XML信息集是用来表示一个XML文档的数据模 型。它也是XML规范继承的基础抽象模型。图片6.1显示了可扩展标记语言(XML)与XML信息集的关系。
图片6.1 XML信息集
XML和XML信息集间的一个关键的区分就是XML信息集不确定一个具体类型。所以尽管XML标准使用一个文本格式,XML信息集没有这种限制。相比直接 使用XML来说使用XML信息集有很多重要的优势。例如,WCF可以以不同的行为表示消息只要它们基于一个XML信息集。这包括由XML1.1标准限定的 文本格式和其他格式比如二进制格式。这允许WCF与XML一起使用,但是基于交互性和性能的要求一般要选择最合适的标准。
编码是用来描述将一个WCF消息转换成一个字节数组的规则。这样便于消息在一个传输协议上通信。WCF提供了5种编码格式类型: 二进制,文本,消息转换优化架构(MTOM),JavaScript 对象标记(JSON)和普通原有XML(POX)。具体使用哪一种编码取决于你的应用程序的需求。例如,你可能想在.NET应用程序间使用 BinaryMessageEncoder编码来提升性能,使用TextMessageEncoder或者MtomMessageEncoder来支持基 于WS-* Web 服务的交互,或者使用JsonMessageEncoder来支持基于Ajax的Web 应用。编码是WCF提供的结构扩展;因此,WCF可以扩展来支持新的编码器如果默认提供的编码器不能满足你的需求时。
这一章的剩下部分探讨了WCF使用序列化和编码来在一个传输协议上转发消息。我们将检查不同行为的序列化和编码并为每个选项应该使用的情况提供场景。
=======
转载自