Tipos admitidos por el serializador de contrato de datos
Windows Communication Foundation (WCF) utiliza DataContractSerializer como su motor de serialización predeterminado para convertir los datos en XML y viceversa. DataContractSerializer está diseñado para serializar los tipos de contrato de datos. Sin embargo, admite muchos otros tipos, de los que se puede pensar que tienen un contrato de datos implícito. A continuación, se muestra una lista completa de los tipos que se pueden serializar:
Todos los tipos públicamente visibles que tienen un constructor que no tiene parámetros.
Tipo de contrato de datos Éstos son tipos a los que se ha aplicado el atributo DataContractAttribute. Normalmente, los tipos personalizados que representan objetos de negocio se deberían crear como tipos de contrato de datos. Para obtener más información, vea Utilización de contratos de datos y Tipos serializables.
Tipos de colección. Éstos son tipos que representan listas de datos. Éstas pueden ser matrices normales de tipos o tipos de colección, como ArrayList y Dictionary. El atributo CollectionDataContractAttribute se puede utilizar para personalizar la serialización de estos tipos, pero no se requiere. Para obtener más información, vea Tipos de colección en contratos de datos.
Tipos de enumeración. Las enumeraciones, incluidas las de marcas, son serializables. Opcionalmente, los tipos de enumeración se pueden marcar con el atributo DataContractAttribute, en cuyo caso cada miembro que participe en la serialización se debe marcar con el atributo EnumMemberAttribute. No se serializan los miembros que no están marcados. Para obtener más información, vea Tipos de enumeración en contratos de datos.
Tipos primitivos de .NET Framework. Los tipos siguientes integrados en .NET Framework pueden serializarse y se consideran como tipos primitivos: Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Boolean, Char, Decimal, Objecty String.
Otros tipos primitivos. Estos tipos no son primitivos en .NET Framework, pero se tratan como primitivos en forma de XML serializado. Estos tipos son DateTime, DateTimeOffset, TimeSpan, Guid, Uri, XmlQualifiedName y matrices de Byte.
Nota: A diferencia de otros tipos primitivos, DateTimeOffset no es de un tipo conocido de forma predeterminada. Para obtener más información, vea Tipos conocidos de contratos de datos). Tipos marcados con el atributo SerializableAttribute. Muchos tipos incluidos en la biblioteca de clases base de .NET Framework se clasifican en esta categoría. DataContractSerializer admite totalmente este modelo de programación de serialización que fue utilizado por la comunicación remota de .NET Framework, BinaryFormattery SoapFormatter, incluida la compatibilidad para la interfaz ISerializable.
Tipos que representan XML sin formato o tipos que representan datos relacionales ADO.NET. XmlElement y la matriz de tipos XmlNode se admiten como una manera de representar XML directamente. De manera adicional, se admiten los tipos que implementan la interfaz IXmlSerializable, incluido el atributo relacionado XmlSchemaProviderAttribute y los tipos XDocument y XElement. El tipo ADO.NET DataTable y DataSet (así como sus clases derivadas de tipo) implementan la interfaz IXmlSerializable y, por consiguiente, entran dentro de esta categoría. Para obtener más información, vea Clases de XML y ADO.NET en contratos de datos.
Limitaciones del uso de ciertos tipos en modo de confianza parcial
A continuación, se enumeran las limitaciones que existen al utilizar ciertos tipos en escenarios de modo de confianza parcial:
Para serializar o deserializar un tipo que implementa ISerializable en código de confianza parcial mediante el uso de DataContractSerializer se requieren los permisos SerializationFormatter y UnmanagedCode.
Al ejecutar el código de WCF en el modo Confianza parcial, la serialización y deserialización de los campos readonly (tanto public como private) no se admite. Esto se debe a que el IL generado no se puede comprobar y, por consiguiente, requiere permisos elevados.
Tanto DataContractSerializer como XmlSerializer se admiten totalmente en un entorno de confianza parcial. Sin embargo, el uso de DataContractSerializer está sujeto a las siguientes condiciones:
Todos los tipos [DataContract] serializables deben ser públicos.
Todos los campos [DataMember] serializables o propiedades en un tipo [DataContract] deben ser públicos y de lectura/escritura. No se admite la serialización y deserialización de los campos readonly al ejecutar WCF en una aplicación de confianza parcial.
El modelo de programación [Serializable]/ISerializable] no se admite en un entorno de confianza parcial.
Los tipos conocidos se deben especificar mediante código o configuración del nivel de equipo (Machine.config). Los tipos conocidos no se pueden especificar en la configuración del nivel de la aplicación por razones de seguridad.
Los tipos que implementan IObjectReference producirán una excepción en un entorno de confianza parcial porque el método GetRealObject requiere el permiso de seguridad [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)].
Notas adicionales sobre serialización
Las reglas siguientes también se aplican a los tipos admitidos por el serializador de contrato de datos:
El serializador del contrato de datos admite totalmente los tipos genéricos.
El serializador del contrato de datos admite totalmente los tipos NULL.
Los tipos de interfaz se tratan como Object o, en el caso de interfaces de colección, como tipos de colección.
Se admiten tanto las estructuras como las clases.
DataContractSerializer no admite el modelo de programación utilizado por los servicio web ASP.NET y XmlSerializer. En particular, no admite atributos como XmlElementAttribute y XmlAttributeAttribute. Para habilitar la compatibilidad de este modelo de programación, WCF se deben cambiar para que use XmlSerializer en lugar de DataContractSerializer.
El tipo DBNull se trata de una manera especial. Es un tipo singleton y tras la deserialización, el deserializador respeta la restricción de singleton y señala todas las referencias DBNull a la instancia de singleton. Dado que DBNull es un tipo serializable, exige permiso SerializationFormatter.
Vea también
Conceptos
Clases de XML y ADO.NET en contratos de datos
Utilización de contratos de datos
Tipos serializables
Tipos de colección en contratos de datos
Tipos de enumeración en contratos de datos