代码改变世界

WCF 第六章 序列化与编码 系列文章

2011-06-28 21:32  DanielWise  阅读(2788)  评论(5编辑  收藏  举报

上一个系列我们主要描述WCF行为,包括服务行为、操作行为和安全行为。服务行为包括服务有一个实例的并发、多个实例并发以及多线程访问;操作行为中有涉及WCF中相对常见和重要的WCF事务处理方面内容,个人认为这一章还是很重要的。这一系列主要讲述WCF中的序列化与编码,包括不同编码/序列化器选择原则,大数据流操作等等。相信通过本系列你可以更加了解WCF底层是如何处理数据的。

[第1篇] 基础

在第二章"契约",我们讨论了使用DataContract序列化器在客户端和服务端之间将CLR类型转换成基于标准的XML的序列化。然而有很多场景并不适合使用DataContract序列化器。这包括不支持DataContract序列化器的对已存在的CLR类型的序列化,原有的Web 服务,交互系统,代码合并(比如.NET Remoting)和数据形状。数据形状是指控制一个用来性能优化和契约优先开发的序列化成XML的.NET类型的过程。在这些情况下,了解如何使用WCF和.NET Framework提供的序列化工具是很重要的。

编码是另外一个与序列化相关的重要主题。WCF在对象序列化和将消息转换成可以使用一个传输协议发送的字节间做了很多区别。

[第2篇] 比较WCF序列化选项

使用WCF有很多种方式来序列化对象。确定使用哪种方法来序列化取决于一系列因素。这些因素包括你是否想要与契约共享类型,支持现有的.NET类型,保留引用以及更多。

[第3篇] NetDataContractSerializer

NetDataContractSerializer是WCF中一个可以替代的序列化方法,它允许类型共享。这个类可以再System.Runtime.Serialization命名空间中找到。当类型必须在客户端和服务端保持正确时会使用这个序列化方法。NetDataContractSerializer通过对CLR类型添加额外信息并保存引用来支持类型精确。除了这个,在NetDataContractSerializer和DataContractSerializer之间没有任何不同。

[第4篇]XmlSerializer

XmlSerializer 是WCF中可以用来序列化的第三种方法。XmlSerializer 是已经被.NET2.0 架构内建支持的一个序列化方法。使用XmlSerializer有好几个优势,包括对已有.NET类型的支持,与ASP.NET Web 服务的兼容,和改变XML输出的能力。

[第5篇] DataContractJsonSerializer

DataContractJsonSerializer支持使用以JavaScript 对象标记作为序列化格式并添加到.NET 3.5 Framework 中。如果从一个使用JavaScript 的网络应用调用服务序列化会工作的很好,特别是ASP.NET AJAX 和Silverlight 网络应用。当使用WebScriptEnablingBehavior行为时会使用DataContractJsonSerializer。对应的,如果WebHttpBehavior行为配置成使用JSON编码也可以使用DataContractJsonSerializer。这些终结点行为指导WCF支持REST/POX 类型服务。

[第6篇] 保留引用和循环引用

关于引用和序列化有两个重要的问题。这两个问题都是关于通过引用保留跟踪的。当你试着优化需要序列化的数据总量或者当在客户端和服务端共享类型信息时保留引用将会起很重要的作用。

[第7篇]使用NetDataContractSerializer共享类型

WCF 中的默认序列化方法是DataContractSerializer. 这是WCF开发组想要大部分开发人员使用的序列化方法因为它强制进行契约共享而非类型共享。这是创建面向服务架构的一个原则。然而,如果你的想法是支持类型一致并在客户端和服务端间共享类型信息那么这个方法并不会为你的设计引入问题,你可以使用NetDataContractSerializer来序列化。就像在之前的”比较WCF序列化选项”章节描述的那样,NetDataContractSerializer与DataContractSerializer本质是类似的,但是额外支持了类型信息共享和引用保留。

[第8篇] 使用IExtensibleDataObject 的双向序列化

对支持面向服务的架构来说,数据契约版本化会随着时间推移称为面向服务的一个重要方面。随着时间推移,比如创建了新的服务,它生成了一个数据契约的新版本,通过添加额外的信息。而不是重编译所有之前使用老的数据契约版本的客户端和服务端,你可能希望它们可以平滑的升级以便于可以共享公共数据,这也正是DataContractSerializer 要做的事情。

[第9篇] 使用代理序列化类型

有时你可能需要完成一个不可序列化或者需要对序列化内容进行改变的序列化过程。一个例子是由第三方组件提供者提供或者一个你不再拥有源码的组件中的一个类型。

[第10篇]大数据流

WCF支持两种消息处理模式: 缓冲和流模式。缓冲是WCF中处理消息的默认模式。在这个模式下,整个消息在发送和接收之前被放入内存中。在大多数场景,缓冲消息是重要的而且有时需要支持一些诸如可信赖消息和数字签名的特性。然而,缓冲大消息将很容易导致系统资源耗尽并限制可扩展性。WCF支持另外一种使用流处理消息的模式。在这个模式中,在客户端和服务端的数据使用一个System.IO.Stream.Streaming。流模式一般在一个绑定或一个传输信道上使用。

[第11篇]为自定义序列化使用XmlSerializer

DataContractSerializer是WCF中优先选择的序列化方法。然而,有时你需要使用默认序列化方法以外的方法。一个改变序列化方法的选项是使用XmlSerializer,包括实现自定义序列化的能力,共享类型和支持原有网络服务的能力。对DataContractSerializer,XmlSerializer是WCF集成的一部分。这部分主要查看下XmlSerializer并讨论它如何用来控制XML输出。

[第12篇] 编码选择

在WCF之前,你有很多创建分布式应用程序的选择。其中的两个选择是.NET Remoting和ASP.NET 网络服务。.NET Remoting 很适合.NET 应用程序间的通信因为它使用二进制编码传输数据。这比ASP.NET 网络服务提供更好的性能,ASP.NET 网络服务在交互中使用文本编码。由于文本编码允许跨平台交互所以它在ASP.NET 网络服务中是被广泛接受的。WCF将编码架构抽象出来并允许同时使用两种编码格式的绑定存在。这使得WCF可以同时取代.NET Remoting和ASP.NET 网络服务。

[第13篇]总结

这一章描述了WCF的序列化和编码能力。作为WCF的剩余部分,有很多特性允许你自定义和扩展序列化。