Типы, поддерживаемые сериализатором контракта данных
В 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.
Примечание В отличие от других типов-примитивов тип 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 в контрактах данных
Использование контрактов данных
Сериализуемые типы
Типы коллекций в контрактах данных
Типы перечислений в контрактах данных