基于集合类型的序列化具有一些特殊的规则和行为,在上篇中我们详细介绍了基于泛型数据契约的序列化规则,接下来我们介绍基于集合对象的序列化,以及基于集合类型的服务操作。...Serialize对以下3种不同类型的集合对象进行序列化:IEnumerable、IList和Customer[]。...从下面的XML的结构和内容中,我们可以总结出下面3条规则: 根节点的名称以ArrayOf为前缀,后面紧跟集合元素类型对应的数据契约名称; 集合元素对象用数据契约的命名空间作为整个集合契约的命名空间...那么在WCF下对自定义集合类型具有哪些限制,DataContractSerializer对于自定义集合类型又具有怎样的序列化规则呢?我们接下来就来讨论这些问题。...(Data Contract)和数据契约序列化器(DataContractSerializer) WCF技术剖析之十三:序列化过程中的已知类型(Known Type) WCF技术剖析之十四:泛型数据契约和集合数据契约
这就为数据的表现提出了要求,为了保证处于不同平台、不同厂商的应用能够正常地进行数据交换,交换的数据必须采用一种大家都能够理解的展现方式。在这方面,XML无疑是最好的选择。...所以WCF下的序列化(Serialization)解决的就是如何将数据从对象的表现形式转变成XML表现形式,以确保数据的正常交换。从本章起,我将讲述WCF序列化的本质,首先从从数据契约谈起。...一、数据契约 一个正常的服务调用要求客户端和服务端对服务操作有一致的理解,WCF通过服务契约对服务操作进行抽象,以一种与平台无关的,能够被不同的厂商理解的方式对服务进行描述。...注: 数据契约和数据成员只和是否应用了DataContractAttribute和DataMemberAttribute有关,与类型和成员的存取限制修饰符(public,internal、protected...二、数据契约序列化器(DataContractSerializer) 在WCF中,数据契约的定义是为序列化和反序列化服务的。
public interface IContractManager { Contract[] GetContracts(); } 如果契约中的集合为具体集合类型而非接口,而且属于可序列化集合...,那么只要提供的集合包含了Add方法,并且符合以下签名中的一种,WCF就能够自动地将集合规范为数组类型。 ...CollectionDataContract特性 前面所示的编组为具体类型的机制并不理想,原有有三 它要求集合必须可序列化,而不是使用DataContract特性。...对于集合是否包含Add方法,或者集合是否支持IEnumerable和IEnumerable接口,并没有编译时或者运行时的有效验证。如果不符合条件,就会导致数据契约不可工作。...和DataContract相似,它不能序列化集合,将它应用到一个集合上时,会将集合当作一个泛型的链表类型公开给客户端链表可能不会对原来的集合执行任何操作,但它会提供一个类似接口的集合类型,而不是数组。
我意识到这可能和WCF中用于判断服务寄宿方式的逻辑有关,于是我让这位朋友将相同的服务寄宿代码和配置迁移到GUI程序或者Console应用中,看看是否正常。...[第13篇] 序列化过程中的已知类型(Known Type) DataContractSerializer承载着所有数据契约对象的序列化和反序列化操作。...为了确保DataContractSerializer的正常序列化和反序列化,我们需要将“未知”类型加入 DataContractSerializer“已知”类型列表中。...序列化依赖于真实具体的类型,而泛型则刻意模糊了具体类型概念。而集合代表一组对象的组合,集合具有可迭代(Enumerable)的特性,可以通过某个迭代规则遍历集合中的每一个元素。...由于范型类型和集合类型在序列化和反序列化上具有一些特殊的行为和规则,在这篇文章中,我将会对此进行详细介绍。
Communication Foundation(WCF)包括新序列化引擎DataContractSerializer。...,并写入自己的自定义包装元素(或者甚至连同跳过写入包装) 第三部分--反序列化 对对象进行反序列化的最基本的方式是调用ReadObject方法重载之一。 ...这些是已应用了DataContractAttribute属性的类型。表示业务对象的新自定义类型通常应作为数据协定类型创建。有关更多信息,请参见使用数据协定。 集合类型。这些是表示数据列表的类型。...这些类型可以是常规的类型数组或集合类型,例如,ArrayList和Dictionary.CollectionDataContractAttribute属性可以用于自定义这些类型的序列化,但不是必需的。...表示原始XML的类型或表示ADO.NET关系数据的类型。支持XmlElement和XmlNode类型的数组作为一种直接表示XML的方式。
DataContractSerializer承载着所有数据契约对象的序列化和反序列化操作。...在这篇文章中,我们会详细讨论WCF序列化中一个重要的话题:已知类型(Known Type)。 WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML。...为了确保DataContractSerializer的正常序列化和反序列化,我们需要将“未知”类型加入DataContractSerializer“已知”类型列表中。...图1 “未知”类型导致的序列化异常 二、DataContractSerializer的已知类型集合 解决上面这个问题的唯一途径就是让DataContractSerializer能够识别Order类型,...在下面的代码中,在调用Serialize的时候,将泛型类型分别设定为接口IOrder和抽象类OrderBase。虽然是对同一个Order对象进行序列化,但是序列化生成的XML却各有不同。
如果一个类型,不一定是数据契约,和给定的数据契约具有很大的差异,而我们要将该类型的对象序列化成基于数据契约对应的XML。...以上面Contact和Customer为例,在正常的情况下,DataContractSerializer针对类型Customer对一个真正的Customer对象进行序列化,现在要求的是通过DataContractSerializer...序列化一个Contact对象,并且要生成与Customer等效的XML,就要在序列化的过程中实现类型的替换(由Contact类型替换成Customer类型)和对象的替换(由Contact对象替换成Customer...(Data Contract)和数据契约序列化器(DataContractSerializer) WCF技术剖析之十三:序列化过程中的已知类型(Known Type) WCF技术剖析之十四:泛型数据契约和集合数据契约...(上篇) WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇) WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 WCF技术剖析之十六:数据契约的等效性和版本控制
由于范型类型和集合类型在序列化和反序列化上具有一些特殊的行为和规则,在这篇文章中,我将会对此进行详细介绍。上篇先来说所泛型数据契约。...所以,从某种意义上讲,WCF的一个重大的作用就是弥合面向对象编程(OOP)和面向服务架构(SOA)之间的差异。我们现在就来看看WCF做了些什么使我们能够以泛型类型的形式来定义数据契约。...对于泛型类型Bill,不同的BillHeader和BillDetail组合代表不同的数据契约,所以最终的数据契约的名称需要由自身类型和泛型契约名称派生出来。...(Data Contract)和数据契约序列化器(DataContractSerializer) WCF技术剖析之十三:序列化过程中的已知类型(Known Type) WCF技术剖析之十四:泛型数据契约和集合数据契约...(上篇) WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇) WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 WCF技术剖析之十六:数据契约的等效性和版本控制
在WCF中,有3中不同的方式可供选择:Binary;Text和MTOM(Message Transmit Optimized Mechanism)。...DataContractSerializer Serialization 是通过Serializer来完成的,在WCF中,我们有3种不同的Serializer——DataContractSerializer...他们不同的方式实现.NET Object的Serialization。...其中DataContractSerializer为WCF默认的Serializer,如果没有显式定采用另外一种Serializer,WCF会创建一个DataContractSerializer 序列化NET...,把它反序列化成DataContractOrder 对象,看它的内容是否和原来一样。
今天讲第六集,这两个是用来修饰需要序列化的实体类的特性,并且也会涉及到KnownType 看了之后觉得是一个很有用的特性。...在介绍下面东西之前,我们先介绍几个概念 什么是Serialization和Deserialization 从WCF角度来说,Serialization(序列化)是个转换的过程,它把一个实体类转换为XML...如果不特殊指定,WCF用DataContractSerializer来序列化object(终于出现标题上的关键字了)。...那是因为,从framework 3.5开始,如果我们没有使用DataContract 或者DataMember 特性,那么WCF的DataContractSerializer会自动把所有的public属性按照字典序的顺序序列化...上面说了我们可以通过给一个类加Serializable或者是DataContract特性来显式标记一个需要序列化的类,下面我们来看看这两种方式有什么不同。
第1章 WCF简介 (WCF Overview) 1.1 SOA的基本概念和设计思想 1.2 WCF是对现有Windows平台下分布式通信技术的整合 1.3 构建一个简单的WCF应用 1.3.1 步骤一...WCF实现了CLR类型和XML的适配 4.2. 定义服务契约 4.3.1. ServiceContractAttribute 4.3.2....DataContractSerializer 5.3.1. DataContractSerializer的序列化规则 5.3.2. 如何限定序列化对象的数量? 5.3.3....已知类型 5.4.1. 未知类型导致序列化失败 5.4.2. DataContractSerializer的已知类型集合 5.4.3. 基于接口的序列化 5.4.4....一个精简版的WCF框架 8.1.1. 从透明代理和真实代理说起 8.1.2. 服务代理的真实代理是什么? 8.1.3. 服务调用的大致流程 8.1.4.
当WCF客户端框架介绍到该Fault消息之后,会做一项相反的操作:对Fault消息中进行解析和反序列化,重新生成并抛出FaultException异常。...由于此操作需要对错误明细对象进行反序列化,所以需要指定错误明细类型对应的序列化器,默认情况下采用的是DataContractSerializer。...通过MessageFault众多的CreateFault静态方法,我们可以以不同的组合方式指定构成SOAP Fault的5个元素。...如果指定了错误明细对象,需要指定与之匹配的序列化器以实现对其的序列化和反序列化。...将绝大部分序列化和反序列化的工作都交付给两个序列化器:DataContractSerializer和XmlSerializerObjectSerializer,对于FaultException异常对象的序列化自然也不例外
数据契约是对用于交换的数据结构的描述,是数据序列化和反序列化的依据。在一个WCF应用中,客户端和服务端必须通过等效的数据契约方能进行有效的数据交换。...一、数据契约的等效性 数据契约就是采用一种厂商中立、平台无关的形式(XSD)定义了数据的结构,而WCF通过DataContractAttribute和DataMemberAttribute旨在给相应的类型加上一些元数据...,帮助DataContractSerializer将相应类型的对象序列化成具有我们希望结构的XML。...简言之,如果承载相同数据的两个不同数据契约类型对象最终能够序列化出相同的XML,那么这两个数据契约就可以看成是等效的数据契约。...WCF允许我们通过自定义特性的方式注册序列化的回调方法,这些DataContractSerializer在进行序列化或者反序列化过程中,会回调你注册的回调方法。
类型,有一个与本章主题相关的类型为System.ServiceModel.Description.FaultDescriptionCollection的集合属性:Faults,表示与本操作相关的所有错误描述的集合...服务端运行时以操作描述为基础创建相应的DispatchOperation后,会根据错误描述创建FaultFormatter对象,声明类型为IDispatchFaultFormatter。...,介于不同的序列化方式的需要,WCF异常处理框架使用两个不同的FaultFormatter:DataContractSerializerFaultFormatter还是XmlSerializerFaultFormatter...,分别利用DataContractSerializer和XmlSerializer这两个不同的序列化器实现对FaultException异常对象的序列化和反序列化。...我们可以在服务契约、服务类型和服务操作方法上面应用XmlSerializerFormatAttribute这么一个特性让WCF采用XmlSerializer作为序列化器对FaultException异常进行序列化和反序列化
服务契约关注于对服务操作的描述,数据契约关注于对于数据结构和格式的描述,而消息契约关注的是类型成员与消息元素的匹配关系。 我们知道只有可序列化的对象才能通过服务调用在客户端和服务端之间进行传递。...比如说,我们有一个服务操作采用流的方式进行文件的上载,除了以流的方式传输以二进制表示的文件内容外,还需要传输一个额外的基于文件属性的信息,比如文件格式、文件大小等。...在WCF体系中,MessageFormatter负责序列化和反序列化任务(在《WCF技术剖析(卷1)》中的第5章对基于MessageFormatter的序列化机制有详细的介绍):ClientMessageFormatter...Order是一个消息契约,属性OrderID和Date通过MessageHeaderAttribute定义成消息报头,作为主体的Details的类型OrderDetails被定义成集合数据契约。...根据使用的序列化器的不同,WCF中定义了两种典型的MessageFormatter:一种是基于DataContractSerializer的DataContractSerializerOperationFormatter
WCF中传输的数据不想传统的面向对象编程,它只传递了一些对象的属性,但是自身并不知道自己属于什么对象,所以,他没有子类和父类的概念,因而也就没有Is-a的关系,所以在WCF中,如果想维持这种继承关系,就需要做一些特殊的处理了...实现这种数据契约解析器的方法 在WCF中,存在DataContractResolver类,可以在这个类中提供一个维护了唯一标识符和类型之间的映射关系字典,在序列化这个类型时,需要提供一个唯一的标识符作为键形成键与类型的映射关系...,WCF会在反序列化期间提供这些键。...,之后需要分别在代理端和宿主端安装解析器, 在ServiceEndpoint中有一个类型为ContractDascription的Contract属性,它是一个操作描述的集合,每一个描述操作描述(OperationDescription...)都包含一个类型为IOperationBehavior类型的行为集合,而每一个行为又包含一个DataContractResolver属性,这个属性默认为null,就是在这里,可以设置我们自定义的解析器。
WCF通过一个重要的对象实现对托管对象的序列化和反序列化:序列化器(Serializer)。...具体来说,所有序列化和反序列化的功能又最终落实到两个具体的序列化器上:DataContractSerializer和XmlSerializer。...WCF采用的默认序列化器是DataContractSerializer,但是有的时候,我们需要显示地控制某个服务或者服务的某个操作的序列化行为,通过XmlSerializer来序列化和反序列化操作的参数对象和返回值...举个例子,一个服务的绝大部分操作的参数类型都是通过数据契约的方式定义,但是对于个别的操作参数类型依然沿用的是传统XML的定义方式。...DataContractSerializer进行序列化和反序列化。
在客户端,我们具有两种典型的服务代理创建方式,其一是通过诸如SvcUtil.exe这样的工具导入服务的元数据生成相应的服务代理(一个继承自ClientBase的类型)代码和相关配置;其二是直接通过相应的终结点信息...在本例中,先后以相同的方式(调用相同的构造函数,传入相同的参数)创建并开启了两个CalculatorClient对象,然后检验它们的ChannelFactory是否是相同的对象。...我们可以将这个ChannelFactory集合看成是一个字典,字典的值就是ChannelFactory,而键则通过下面三个对象派生: CallbackInstance:以InstanceContext...(Data Contract)和数据契约序列化器(DataContractSerializer) WCF技术剖析之十三:序列化过程中的已知类型(Known Type) WCF技术剖析之十四:泛型数据契约和集合数据契约...(上篇) WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇) WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 WCF技术剖析之十六:数据契约的等效性和版本控制
EndpointAddress通过以Headers属性代表的地址报头列表存放一些寻址的信息。本篇文章着重讲述地址报头。WCF的通信完全建立在消息交换上,而WCF支持多种不同类型的消息。...默认采用的序列化器类型是DataContractSerializer,我们也可以调用第二个重载认为地指定序列化器。...针对可序列化对象创建的AddressHeader对象,其属性Name和Namespace返回的是对象序列化后生成的XML的根节点的名称和命名空间。...而结点下的元素就是通过编程方式指定的AddressHeader的值序列化后的XML。...,所以如果我直接在消息上以手工的方式添加相应的报头也能得到相同的效果。
由于WCF的扩展性,我们可以采用不同的方式实现对消息的压缩,本文提供一种比较简单的实现方式。...直接创建用于压缩和解压缩的信道,在CodePlex中具有这么一个WCF Extensions; 自定义MessageFormatter实现序列化后的压缩和法序列化前的解压缩,这就是我们今天将要介绍的解决方案...二、DataCompressor——用于数据压缩与解压缩组件 我们支持两种方式的压缩,Dflate和GZip。两种不同的压缩算法通过如下定义的CompressionAlgorithm枚举表示。...在默认的情况下,WCF选用的MessageFormatter为DataContractSerializerOperationFormatter,它采用DataContractSerializer进行实际的序列化和法序列化操作...而DataContractSerializer仅仅是WCF用于序列化的一种默认的选择(WCF还可以采用传统的XmlSeriaizer)。
领取专属 10元无门槛券
手把手带您无忧上云