Поделиться через


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

По умолчанию DataContractSerializer сериализует все общедоступные типы. Все публичные свойства и поля типа, доступные для чтения и записи, сериализуются.

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

Сериализация по умолчанию

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

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

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

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

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

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

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

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

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

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

Наследство

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

См. также