WCF中关于List和数据的转换问题

今天写的一个WCF中在服务端明明写的是返回类型是一个List,但是在客户端调用时就变成了返回类型是数组的.

我在数据后面加了一个.toList()方法.虽然问题解决了.但是还是有疑问,明天找找具体原因

原因如下:

在.Net中将实现了IEnumerable接口的所有类型(包括数组和泛型)都称之为集合类型。把其中实现了IDictionary接口或泛型IDictionary接口的集合类型称为字典集合,剩下的其他集合类型为列表集合。

缺省情况下,WCF框架对集合类型是内建支持的,也就说你不需要应用任何属性,就可以将集合应用在数据契约(协定)中,但前提是集合中的元素必须是应用了 DataContractAttribute属性或者是可序列化的类型。这时,数据契约(协定)名称和命名空间就依赖集合中包含的元素的类型的名称和命名 空间了,它们不受集合类型本身的名称和命名空间的影响。

在WCF中应用了CollectionDataContractAttribute属性的集合称之为定制数据契约集合,否则为非定制数据契约集合。 不管是非定制数据契约集合还是定制数据契约集合,只要它们的数据契约名称和循环元素的名称都相同(如果是字典集合其Key和Value也要是相同的),我 们就说它们是等价的。由于非定制数据契约集合的数据契约以及循环元素的名称由集合中的类型决定,所以非定制数据契约集合的数据契约等价遵守以下几个规则 (关于数据契约等价的其他详细信息请参见我以前的文章:WCF Data Contract之契约等价):

1、相同类型的列表集合被认为具有相同的数据契约(协定)例如:List和int[]是等价的。

2、具有相同相同键和值类型的所有字典集合也被视为具有相同的数据契约(协定)

3、接口和实现该接口的具体集合类的数据契约是等价的。例如IList和List等价。

4、非泛型集合与Object类型的泛型集合的数据契约等价。例如:List<Object>与ArrayList等价,ArrayList与Object[]也是等价的。

3、集合与KnowType

集合类型和非集合类型在多态增加KnowType类型方面是不同的,关于非集合方面增加KnowType的详细情况请我以前的文章:WCF Data Contract之KnowType。集合类型在增加KnowType类型遵守以下规则:

3.1、集合类型是以多态方式来代替其他集合或集合接口的,您不需要将这样的集合类型添加到KnowType类型中。例如上例中Customer2类中的addresses,你可以将List的实例赋值给它,而不需要将List增加到KnowType类型列表中。

3.2、当您以多态方式使用集合来代替非集合类型时,则需要将它们添加到已知类型。 例如,如果您声明一个 Object 类型的数据成员并将其用于发送 ArrayList 的一个实例,则需要将 ArrayList 添加到已知类型中。

3.3、等价的集合只能应用KnowTypeAttribute属性来将其增加到KnowType列表中一次。例如:不能将ArrayList和Object[]都添加到相同类的KnowType列表中

4、定制集合的数据契约(协定)      

我们可以使用CollectionDataContractAttribute的下列属性来指定集合的数据契约的相关名称及命名空间:

4.1、Name属性来指定集合数据契约的名称(如果没有使用此属性,将使用集合类型的名称)

4.2、Namespace属性来指定其命名空间

4.3、ItemName 属性来指定循环元素的名称

4.4、针对字典集合还可以用KeyName和ValueName来指定键和值的名称

主要参考来自51CTO (http://developer.51cto.com/art/200803/67148_1.htm)

原文地址:https://www.cnblogs.com/qishiguilai/p/WCFIList.html