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


Класс 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.

Если вы создаете класс с полями или свойствами, которые должны быть заполнены перед сериализацией или десериализацией, используйте атрибуты обратного вызова, как описано в Version-Tolerant Сериализация обратных вызовов.

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

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

Замечание

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

Совместимость с будущими версиями

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

Запуск в условиях частичного доверия

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

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