DataContracts и DataMembers

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

Ответ 1

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

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

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

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

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

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

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

Прочитайте все об этом подробнее от Аарона Сконнара в Pluralsight.

Ответ 2

Мне нравится marc ответ, но я хочу добавить дополнительную информацию.

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

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

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

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