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

Windows Communication Foundation (WCF) использует в DataContractSerializer качестве подсистемы сериализации по умолчанию для преобразования данных в xml и преобразования XML обратно в данные. Сериализатор DataContractSerializer предназначен для сериализации типов 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 не является по умолчанию известным типом. Дополнительные сведения см. в разделе Data Contract известные типы.

  • Типы, помеченные с помощью атрибута 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 в режиме частичного доверия сериализация и десериализация полей ( 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 .

См. также