WCF CollectionDataContract - PullRequest
       8

WCF CollectionDataContract

7 голосов
/ 21 апреля 2011

Я недавно заметил, что в одной из статей операция службы wcf вернула коллекцию datacontract

Users GetUsers(string someInput);

И тип Users был определен следующим образом:

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

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

Возвращает ли коллекцию datacontract (например,Пользователи в этом случае) служат не для того, чтобы просто вернуть List<User>?

Ответы [ 3 ]

6 голосов
/ 21 апреля 2011

Насколько я понимаю, этот атрибут даст вам некоторый контроль над тем, какие имена будут иметь элементы в конечной строке xml после того, как DataContractSerializer выполнил свою работу по сериализации вашей коллекции.

Это может быть полезно, когда вам придется вручную анализировать результат (другими словами, вы будете знать, какой элемент искать в этом тексте xml, чтобы найти вашу коллекцию и ее части).

Посмотрите на это для примеров и дополнительной информации:

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

1 голос
/ 21 апреля 2011

если вы возвращаете List, у сериализатора данных есть особый способ генерации xml. Я не знаю, как он это делает для List, но если бы это был массив, он бы сгенерировал что-то вроде - ... здесь Пользовательский объект 1 ...так далее.

Но с помощью CollectionDataContract вы можете сериализовать его и лучше представить его пользователям, которые могут создавать XML вручную. Пример - я бы мог привести - CollectionDataCOntract (Name = "AllUsers") // я не помню ItemName или Name

тогда ожидаемый XML будет чем-то похожим на - ... здесь Пользовательский объект 1 ...так далее.

Это одна утилита для этого.

0 голосов
/ 22 марта 2012

Просто чтобы пояснить ответ Андрея и поделиться своим опытом, я только что столкнулся с проблемой, которую окончательно решил с помощью 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 просто дал мне простой способ управления именем корневого элемента списка.

...