WCF集合类型各种限制于规则介绍

开发 开发工具
我们今天主要就是通过对WCF集合类型的限制要求,以及一些更高级的规则制度来对此方面做一个详细的介绍,希望对大家有所帮助。

WCF开发插件中,有很多内容值得我们去深入的研究。我们需要在不断的实践中去积累应用技巧,来满足我们的应用需求。在这里我们就为大家介绍一下其中一个比较基础的知识,WCF集合类型的相关概念。#t#

WCF集合类型的要求限制

不是所有的集合类型都可以在WCF中使用,只有满足以下要求才可以使用:

该集合类型有一个缺省的构造函数

该集合类型有一个名为Add的方法

这是因为在反序列化集合类型时,WCF框架首先调用该集合类型的无参数的构造函数,然后通过非静态的Add方法来将循环元素增加到集合中。所以以上限制主要是针对反序列化而设定的。

WCF集合类型中的一些高级规则

WCF框架在序列化时支持集合的集合,也支持数组的数组(交错数组),但不支持多唯数组。

字节数组和 XmlNode 数组是特殊的数组类型,将被视为基元,而不是集合。 序列化字节数组会产生单个包含一个 Base64 编码数据块的 XML 元素,而不是为每个字节都生成一个单独的元素。(笔者认为这是为了性能的考虑才这么处理的。)

如果集合类型实现了IXMLSerializable接口,假设类型为MyType:IList<string>,IXMLSerializable{…},WCF框架将根据在数据契约中声明的类型来进行序列化,如果声明的是集(接口)如IList<string>,那么该类型将被认为是列表集合来序列化,如果声明的是IXMLSerializable,那么将按照IXMLSerializable来进行序列化,当然需要将该类型加到KnowType类型列表中。如果声明的是该类型本身(如MyType),那么将按照IXMLSerializable的规则来进行序列化。

在对集合进行序列化时,将调用集合类的GetEnumerator 方法来得到集合的内容,在反序列化时将首先调用该集合类型的无参数的构造函数,然后通过非静态的Add方法来将循环元素增加到集合中。(注:虽然这与大家在MSDN的帮助文档中看到的不同,认为字典集合将调用get_Keys和get_Values,以及IList将调用索引器,但笔者使用VS2008验证时没有得到以上方法被调用的结论,所以笔者认为是MSDN文档滞后或有误,如果各位看官能得到和MSDN吻合的结论麻烦告诉一声。)

如果集合类型同时应用了Serialized属性或实现了ISerializable接口,WCF框架将忽略它们;但是如果集合类型不满足集合类型要求(例如缺少Add)方法,那么将按照Serialized或ISerializable来处理;但如果你对该集合同时应用了CollectionDataContract属性而且又不满足集合要求,那么将抛出InvalidDataContractException,而不是按照Serialized或ISerializable来处理。

不能向实现了IXmlSerializable接口的类型使用CollectionDataContractAttribute属性,否则会抛出InvalidDataContractException.向非集合应用CollectionDataContractAttribute属性以及非字典集合指定KeyName或者ValueName属性也都将抛出此异常。

以上就是对WCF集合类型的相关介绍。

责任编辑:曹凯 来源: 博客园
相关推荐

2009-11-09 14:15:17

WCF集合类型

2010-02-25 10:29:17

WCF Transac

2009-11-09 09:34:07

WCF集合

2009-11-09 13:47:22

WCF Stream操

2010-03-01 17:35:29

WCF协定

2010-02-26 14:58:14

WCF单例模式

2009-12-22 09:48:58

WCF枚举类型

2009-12-22 18:29:10

WCF适配器

2010-01-08 16:19:00

VB.NET类型单位命

2010-03-01 09:56:21

WCF自定义集合类型

2010-02-25 14:39:03

WCF术语

2010-02-23 17:30:41

WCF部署于IIS

2009-12-22 11:29:27

WCF自定义集合类型

2009-12-08 18:31:58

WCF WEB

2009-11-05 15:00:26

WCF Stream

2010-02-24 12:41:58

WCF异常处理

2010-02-23 09:51:32

WCF MTOM

2010-02-22 14:18:34

WCF服务验证

2009-12-22 15:14:33

WCF调用

2009-12-22 15:02:40

WCF限流
点赞
收藏

51CTO技术栈公众号