我最近在其中一篇文章中注意到wcf服务操作返回了一个collectiondatacontract
Users GetUsers(string someInput);
用户类型定义如下:
[CollectionDataContract]
public class Users : List<User>
{
public Users()
{
}
public Users(IEnumerable<User> users) : base(users)
{
}
}
返回collectiondatacontract(在这种情况下与用户一样)是否与仅仅返回List<User>
有不同的目的?
答案 0 :(得分:6)
据我所知,在DataContractSerializer完成序列化集合的工作之后,这个属性可以让你控制元素在最终xml字符串中的名称。
当您必须稍后手动解析结果时,这非常有用(换句话说,您将知道在该xml文本中要查找的元素,以查找您的集合及其部分)。
看看这个例子和更多信息:
答案 1 :(得分:1)
如果返回List,则数据序列化器具有生成xml的特定方式。我不知道它是如何为List做的,但如果它是一个数组,它会产生类似的东西 - ...这里用户对象1 ...等等。
但是使用CollectionDataContract,您可以对其进行序列化,并为可能手动创建XML的消费者更好地公开它。示例 - 我可以给 - CollectionDataCOntract(Name =“AllUsers”)//我不记得ItemName或Name
然后预期的XML将类似于 - ...这里用户对象1 ...等等。
这就是一个实用程序。
答案 2 :(得分:0)
为了阐述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>
但是,如果我使用数组或List对象,则根标记始终称为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只给了我一个简单的方法来控制根列表元素的名称。