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
доверия сериализация и десериализация полей (иprivate
public
) не поддерживается. Это объясняется тем, что созданный код на промежуточном языке является непроверяемым и поэтому требует повышенного уровня разрешений.Оба типа 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 .