DataContracts и DataMembers - PullRequest
       3

DataContracts и DataMembers

13 голосов
/ 16 апреля 2011

Есть ли какие-либо способы сказать WCF сериализовать весь класс, когда он вернется?Должен ли я буквально добавлять DataMember к каждому свойству?

Ответы [ 2 ]

24 голосов
/ 16 апреля 2011

Начиная с .NET 3.5 с пакетом обновления 1 (SP1), вам больше не нужно это делать.

Если у вас нет атрибутов [DataContract] и [DataMember], класс DataContractSerializer будет вести себя как старый XmlSerializer: он будет сериализовать все общедоступные свойства чтения / записи, перечисленные в классе.

В этом процессе вы потеряете несколько вещей:

  • , поскольку вы неt * имеет атрибуты [DataMember], вы не можете больше определять порядок полей - они будут сериализованы в порядке появления

  • вы не можете опустить публичное свойство (так как для этого потребуется[DataMember] для всех других свойств / полей)

  • вы не можете определить свойство как Required (которое снова будет в атрибуте [DataMember])

  • ваш класс теперь должен иметь открытый конструктор без параметров (обычно не требуется для контрактов данных)

Читать все об этом подробно от Аарона Сконнарда во множественном свете.

3 голосов
/ 17 апреля 2011

Мне нравится ответ Марка, но я хочу добавить еще немного информации.

DataContractSerializer и DataContractJsonSerializer поддерживают из коробки многие другие модели сериализации. Это включает в себя IXmlSerializable, Serializable и ISerializable. Поддержка POCO была добавлена ​​в .NET 3.5 SP1, но поддержка этих других моделей была всегда с .NET 3

В этом сообщении в блоге подробно описывается степень поддержки и, что более важно, приоритизация различных моделей сериализатором (т. Е. Он сообщает вам, что будут делать сериализаторы на основе DataContract, если у вас один тип, украшенный несколько моделей сериализации)

Итак, если вы прочитаете это сообщение в блоге, вы заметите, что поддержка POCO является последней в списке приоритетов. Это последнее средство сериализатора, если нет абсолютно никакой другой доступной модели программирования сериализации для типа или его родителя. Например, если тип является перечислимым какого-либо рода, он будет сериализован в соответствии с традиционными правилами сбора . Если он ISerializable или Serializable, он будет сериализован в соответствии с их правилами сериализации.

Другое важное отличие: при десериализации всех других типов конструктор по умолчанию с нулевыми параметрами никогда не вызывается. Для типов POCO это всегда вызывается! Это дает вам дополнительный хук, который вы не так легко используете в других моделях сериализации!

...