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


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

В Windows Communication Foundation (WCF) в качестве модуля сериализации по умолчанию для преобразования данных в формат XML и обратно используется DataContractSerializer. Сериализатор DataContractSerializer предназначен для сериализации типов контрактов данных. Однако поддерживаются и многие другие типы, которые можно рассматривать как неявные контракты данных. Полный список сериализуемых типов приведен ниже.

  • Все открытые типы, имеющие конструктор без параметров.

  • Типы контрактов данных. К этим типам применен атрибут DataContractAttribute. Как правило, создавать новые пользовательские типы, представляющие бизнес-объекты, следует в виде типов контрактов данных. Дополнительные сведения см. в разделе Использование контрактов данных и Сериализуемые типы.

  • Типы коллекций. Эти типы представляют списки данных. Это могут быть обычные массивы типов или типы коллекций, например, ArrayList и Dictionary. Для настройки сериализации таких типов можно использовать атрибут CollectionDataContractAttribute, однако это не является обязательным. Дополнительные сведения см. в разделе Типы коллекций в контрактах данных.

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

  • Типы-примитивы .NET Framework. Все следующие типы, встроенные в .NET Framework, могут быть сериализованы и считаются типами-примитивами: Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Boolean, Char, Decimal, Object и String.

  • Другие типы-примитивы. Следующие типы не являются примитивами в .NET Framework, но обрабатываются как примитивы в сериализованной форме XML: DateTime, DateTimeOffset, TimeSpan, Guid, Uri, XmlQualifiedName и массив Byte.

    ms731923.note(ru-ru,VS.100).gifПримечание
    В отличие от других типов-примитивов тип DateTimeOffset не является по умолчанию известным типом. Дополнительные сведения см. в разделе Известные типы контрактов данных).

  • Типы, помеченные с помощью атрибута SerializableAttribute. В эту категорию попадают многие типы из библиотеки базовых классов .NET Framework. Сериализатор DataContractSerializer обеспечивает полную поддержку этой модели программирования сериализации, используемой в удаленном взаимодействии .NET Framework в BinaryFormatter и SoapFormatter, включая поддержку интерфейса ISerializable.

  • Типы, представляющие исходный XML, и типы, представляющие реляционные данные ADO.NET. Типы XmlElement и массив элементов XmlNode поддерживаются для прямого представления XML. Кроме того, поддерживаются типы, реализующие интерфейс IXmlSerializable, включая связанный атрибут XmlSchemaProviderAttribute и типы XDocument и XElement. Типы ADO.NET DataTable и DataSet (а также его наследуемые типизированные классы) реализуют интерфейс IXmlSerializable и поэтому тоже попадают в эту категорию. Дополнительные сведения см. в разделе Типы XML и ADO.NET в контрактах данных.

Ограничения по использованию определенных типов в режиме частичного доверия

Ниже приведен список ограничений при использовании некоторых типов в режиме частичного доверия.

  • Для сериализации или десериализации типа, реализующего интерфейс ISerializable, в коде с частичным доверием с использованием DataContractSerializer требуются разрешения SerializationFormatter и UnmanagedCode.

  • При выполнении кода WCF в режиме Частичный уровень доверия сериализация и десериализация полей readonly (public и private) не поддерживается. Это объясняется тем, что созданный код на промежуточном языке является непроверяемым и поэтому требует повышенного уровня разрешений.

  • Оба типа DataContractSerializer и XmlSerializer поддерживаются в среде с частичным доверием. При этом использование DataContractSerializer зависит от следующих условий.

    • Все сериализуемые типы [DataContract] должны быть открытыми.

    • Все сериализуемые поля и свойства [DataMember] в типе [DataContract] должны быть открытыми и доступными для чтения и записи. Сериализация и десериализация полей readonly не поддерживается при выполнении WCF в приложении с частичным доверием.

    • Модель программирования [Serializable]/ ISerializable] не поддерживается в среде с частичным доверием.

    • Известные типы должны быть заданы в коде или конфигурации уровня компьютера(Machine.config). По соображениям безопасности известные типы нельзя задавать в конфигурации уровня приложения.

  • Типы, реализующие интерфейс IObjectReference, вызывают исключение в среде с частичным доверием, поскольку метод GetRealObject требует разрешения безопасности [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)].

Дополнительные замечания о сериализации

В отношении типов, поддерживаемых в сериализаторе контракта данных, действуют следующие правила.

  • Сериализатор контракта данных полностью поддерживает универсальные типы.

  • Сериализатор контракта данных полностью поддерживает типы, допускающие значение null.

  • Типы интерфейсов обрабатываются либо как объекты Object, либо, в случае интерфейсов коллекций, как типы коллекций.

  • Поддерживаются структуры и классы.

  • Сериализатор DataContractSerializer не поддерживает модель программирования, используемую в XmlSerializer и веб-службах ASP.NET. В частности, не поддерживаются такие атрибуты, как XmlElementAttribute и XmlAttributeAttribute. Чтобы обеспечить поддержку этой модели программирования, необходимо переключить WCF для использования XmlSerializer вместо DataContractSerializer.

  • Тип DBNull обрабатывается особым образом. Это одноэлементный тип, и при десериализации десериализатор соблюдает одноэлементное ограничение и указывает все ссылки DBNull на одноэлементный экземпляр. Поскольку тип DBNull сериализуется, ему требуется разрешение SerializationFormatter.

См. также

Основные понятия

Типы XML и ADO.NET в контрактах данных
Использование контрактов данных
Сериализуемые типы
Типы коллекций в контрактах данных
Типы перечислений в контрактах данных