WCF CollectionDataContract

时间:2011-04-21 00:34:20

标签: c# wcf c#-4.0 datacontract

我最近在其中一篇文章中注意到wcf服务操作返回了一个collectiondatacontract

Users GetUsers(string someInput);

用户类型定义如下:

[CollectionDataContract]
    public class Users : List<User>
    {
        public Users()
        {
        }

        public Users(IEnumerable<User> users) : base(users)
        {
        }
    }

返回collectiondatacontract(在这种情况下与用户一样)是否与仅仅返回List<User>有不同的目的?

3 个答案:

答案 0 :(得分:6)

据我所知,在DataContractSerializer完成序列化集合的工作之后,这个属性可以让你控制元素在最终xml字符串中的名称。

当您必须稍后手动解析结果时,这非常有用(换句话说,您将知道在该xml文本中要查找的元素,以查找您的集合及其部分)。

看看这个例子和更多信息:

http://msdn.microsoft.com/en-us/library/aa347850.aspx

答案 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只给了我一个简单的方法来控制根列表元素的名称。