Types Supported by the Data Contract Serializer

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

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

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

  • Типы коллекций. Эти типы представляют списки данных. Это могут быть обычные массивы типов или типы коллекций, например, ArrayList и Dictionary<TKey,TValue>. Для настройки сериализации таких типов можно использовать атрибут 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.

    Примечание.

    В отличие от других типов-примитивов тип DateTimeOffset не является по умолчанию известным типом. Дополнительные сведения см. в разделе "Известные типы контракта данных".

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

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

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

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

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

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

  • Оба типа 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 .

См. также