WCF CollectionDataContract
本文关键字:CollectionDataContract WCF | 更新日期: 2023-09-27 17:51:26
我最近在一篇文章中注意到wcf服务操作返回了一个collectiondata合约
Users GetUsers(string someInput);
Users类型定义如下:
[CollectionDataContract]
public class Users : List<User>
{
public Users()
{
}
public Users(IEnumerable<User> users) : base(users)
{
}
}
返回一个collectiondata契约(如本例中的Users)是否与简单返回List<User>
有不同的目的?
据我所知,在DataContractSerializer完成序列化集合的工作后,该属性将使您能够控制元素在最终xml字符串中的名称。
当您稍后必须手动解析结果时(换句话说,您将知道在xml文本中查找什么元素,以查找您的集合及其部分),这将非常有用。
查看下面的示例和更多信息:
http://msdn.microsoft.com/en-us/library/aa347850.aspx如果返回List,则数据序列化器具有生成xml的特定方式。我不知道它是如何为列表,但如果它是一个数组,它会生成类似-
<arrayOfUsers>
<User>
...here User object 1
</User>
...etc.
</arrayOfUsers>
但是使用CollectionDataContract可以序列化它,并更好地向可能手工创建XML的消费者公开它。举个例子,我可以给出CollectionDataCOntract(Name="AllUsers")//我不记得ItemName或Name
则期望的XML将类似于-
<AllUsers>
<User>
...here User object 1
</User>
...etc.
</AllUsers>
为了详细说明Andrei的回答并分享我的经验,我刚刚讨论了一个使用CollectionDataContract最终解决的问题。基本上,为了与特定的系统交互,我希望能够发送和接收格式为:
的xml。<SomeMessageList>
<Message>
<ID>blah</ID>
<data1>blah</data1>
<data2>etc.etc.</data2>
</Message>
<Message>
<ID>blah</ID>
<data1>blah</data1>
<data2>etc.etc.</data2>
</Message>
//any number of repeated <Message> here
</SomeMessageList>
然而,如果我使用数组或列表对象,根标签总是称为ArrayOfMessage。如果我创建了一个包含Message对象数组的类(比如称为MsgList),那么WCF将把它作为一个额外的标签添加到混合中,我找不到摆脱它的方法。所以它应该是这样的:
<SomeMessageList>
<MsgList>
<Message>
<ID>blah</ID>
<data1>blah</data1>
<data2>etc.etc.</data2>
</Message>
//any number of repeated <Message> here
</MsgList>
</SomeMessageList>
所以CollectionDataContract给了我一个简单的方法来控制根列表元素的名字