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>有不同的目的?

WCF CollectionDataContract

据我所知,在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给了我一个简单的方法来控制根列表元素的名字

相关文章:
  • 没有找到相关文章