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


Класс System.Runtime.Serialization.DataContractSerializer

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Используйте класс DataContractSerializer для сериализации и десериализации экземпляров типа в XML-поток или документ. Например, можно создать тип Person со свойствами, содержащими такие важные данные, как имя и адрес. Затем можно создать и обработать экземпляр класса Person и записать все значения его свойств: в XML-документ для последующего извлечения или в XML-поток для непосредственного транспорта. Наиболее важным является сериализация и десериализация данных, DataContractSerializer отправленных в сообщениях Windows Communication Foundation (WCF). Применяйте атрибут DataContractAttribute к классам, а атрибут DataMemberAttribute к членам классов, чтобы задать сериализуемые свойства и поля.

Список типов, которые можно сериализовать, см. в разделе "Типы", поддерживаемые сериализатором контракта данных.

Чтобы использовать DataContractSerializer, необходимо сперва создать экземпляр класса и объект, соответствующие записи или чтению формата; например, экземпляр XmlDictionaryWriter. Затем вызовите метод WriteObject для сохранения данных. Для извлечения данных создайте объект, соответствующий чтению формата данных (аналогичный XmlDictionaryReader для XML-документа) и вызовите метод ReadObject.

Дополнительные сведения об использовании DataContractSerializerсериализации и десериализации см. в разделе "Сериализация" и "Десериализация".

Тип сериализатора контракта данных можно задать с помощью <элемента dataContractSerializer> в файле конфигурации клиентского приложения.

Подготовка классов для сериализации или десериализации

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

Например, схема задает тип Customer со свойством ID; уже существует приложение, использующее тип Person со свойством Name. Чтобы создать тип, соответствующий контракту, вначале примените к классу атрибут DataContractAttribute. Затем примените атрибут DataMemberAttribute ко всем сериализуемым полям или свойствам.

Примечание.

Атрибут DataMemberAttribute можно применять как к закрытым, так и к защищенным элементам.

Окончательный формат XML не обязательно должен быть текстовым. DataContractSerializer записывает данные в информационный набор XML, позволяющий записывать данные в любом формате, распознаваемом XmlReader и XmlWriter. Для чтения и записи рекомендуется использовать классы XmlDictionaryReader и XmlDictionaryWriter, так как они оптимизированы для работы с DataContractSerializer.

Если вы создаете класс с полями или свойствами, которые должны быть заполнены до возникновения сериализации или десериализации, используйте атрибуты обратного вызова, как описано в обратном вызове версии tolerant Serialization.

Добавление в коллекцию известных типов

При сериализации или десериализации объекта требуется, чтобы тип был "известен" DataContractSerializer. Вначале создайте экземпляр класса, реализующий IEnumerable<T> (например, List<T>), и добавьте известные типы в коллекцию. Затем создайте экземпляр одного из DataContractSerializer перегрузок, которые принимают IEnumerable<T> (например, DataContractSerializer(Type, IEnumerable<Type>)).

Примечание.

В отличие от других примитивных типов, DateTimeOffset структура не является известным типом по умолчанию, поэтому она должна быть вручную добавлена в список известных типов (см. раздел "Известные типы контракта данных").

Прямая совместимость

DataContractSerializer распознает контракты данных, которые были созданы с учетом необходимости совместимости с будущими версиями контракта. Такие типы реализуют интерфейс IExtensibleDataObject. Интерфейс обладает свойством ExtensionData, которое возвращает объект ExtensionDataObject. Дополнительные сведения о создании контрактов данных, обладающих прямой совместимостью, см. в разделе Контракты данных, совместимые с любыми будущими изменениями.

Запуск под частичным доверием

При создании экземпляра целевого объекта при десериализации DataContractSerializer не вызывает конструктор целевого объекта. Если вы создаете тип [DataContract] , доступный из частичного доверия (то есть является общедоступным и в сборке с AllowPartiallyTrustedCallers примененным атрибутом) и выполняет некоторые действия, связанные с безопасностью, необходимо учитывать, что конструктор не вызывается. В частности нужно помнить, что следующие методики не работают.

  • Если требуется ограничить доступ в режиме частичного доверия, сделав конструктор внутренним или закрытым или посредством добавления LinkDemand в конструктор, ни одно из этих действий не будет выполнено при десериализации в режиме частичного доверия.
  • Если создан класс, для которого предполагается, что конструктор был запущен, класс может перейти в недопустимое внутреннее состояние, то есть в нерабочее состояние.