Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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 атрибут и XDocumentXElement типы. Тип ADO.NETDataTable и DataSet тип (а также его типизированные производные классы) реализуют IXmlSerializable интерфейс и поэтому вписываются в эту категорию. Для получения дополнительной информации см. раздел о типах XML и ADO.NET в контрактах данных.
Ограничения использования определенных типов в режиме частичного доверия
Ниже приведен список ограничений при использовании определенных типов в сценариях частичного доверия:
Для сериализации или десериализации типа, реализующего ISerializable, в частично доверенном коде с использованием DataContractSerializer требуются разрешения SerializationFormatter и UnmanagedCode.
При запуске кода WCF в режиме частичного доверия, сериализация и десериализация полей (
readonly,public, иprivate) не поддерживается. Это связано с тем, что созданный IL является непроверяемым и поэтому требует повышенных разрешений.Оба 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 обрабатывается особым образом. Это одноэлементный тип, и при десериализации десериализатор учитывает ограничение singleton и указывает все
DBNullссылки на одноэлементный экземпляр. Так какDBNullявляется сериализуемым типом, он требует SerializationFormatter разрешения.