Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся дополнительные замечания к справочной документации по этому 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
в конструктор, ни одно из этих действий не оказывает никакого влияния на процесс десериализации при частичном доверии. - Если вы кодируете класс, предполагающий выполнение конструктора, класс может попасть в недопустимое внутреннее состояние, которое можно использовать.