Сериализуемые типы

По умолчанию DataContractSerializer сериализует все открытые типы. Все открытые свойства чтения/записи и поля типа сериализуются.

Изменить предусмотренное по умолчанию поведение можно, применив к типам и членам атрибуты DataContractAttribute и DataMemberAttribute. Этим удобно пользоваться в ситуациях, когда разработчик не имеет возможности управлять типами и изменять их для добавления атрибутов. DataContractSerializer распознает такие "неотмеченные" типы.

Параметры сериализации по умолчанию

Для явного управления сериализацией или настройки сериализации типов и членов можно применять атрибуты DataContractAttribute и DataMemberAttribute. Эти атрибуты также можно применять к закрытым полям. В то же время даже типы, не отмеченные этими атрибутами, сериализуются и десериализуются. Действуют следующие правила и исключения.

  • DataContractSerializer выводит контракт данных из типов без атрибутов, используя свойства по умолчанию только что созданных типов.

  • Все открытые поля и свойства с открытыми методами get и set сериализуются, за исключением членов, к которым применен атрибут IgnoreDataMemberAttribute.

  • Семантика сериализации аналогична семантике XmlSerializer.

  • В неотмеченных типах сериализуются только открытые типы с не имеющими параметров конструкторами. Исключением из этого правила является объект ExtensionDataObject, используемый с интерфейсом IExtensibleDataObject.

  • Доступные только для чтения поля, свойства без метода get или set и свойства с внутренними или закрытыми методами set или get не сериализуются. Такие свойства игнорируются без вызова исключения, кроме случаев с доступными только для возвращения коллекциями.

  • Атрибуты XmlSerializer (такие как XmlElement, XmlAttribute, XmlIgnore, XmlInclude и т. д.) игнорируются.

  • Если не применить к типу атрибут DataContractAttribute, все члены в этом типе, к которым применен атрибут DataMemberAttribute, игнорируются сериализатором.

  • Свойство KnownTypes поддерживается в типах, не отмеченных атрибутом DataContractAttribute. Это подразумевает поддержку атрибута KnownTypeAttribute на неотмеченных типах.

  • Чтобы исключить из процесса сериализации открытые члены, свойства или поля, применяйте к таким членам атрибут IgnoreDataMemberAttribute.

Наследование

Неотмеченные типы (типы без атрибута DataContractAttribute) могут наследоваться от типов, имеющих этот атрибут. В то же время обратное невозможно: типы с атрибутом от неотмеченных типов наследоваться не могут. Это правило применяется в основном для обеспечения обратной совместимости с кодом, написанным в более ранних версиях платформа .NET Framework.

См. также