Tipos admitidos por el serializador de contrato de datos
Windows Communication Foundation (WCF) usa DataContractSerializer como el 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, consulte Uso 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<TKey,TValue>. El atributo CollectionDataContractAttribute se puede utilizar para personalizar la serialización de estos tipos, pero no se requiere. Para obtener más información, consulte 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, consulte 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, XmlQualifiedNamey 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, consulte Tipos conocidos de contratos de datos.
Tipos marcados con el atributo SerializableAttribute . Muchos de los tipos que están 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 de 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.NETDataTable y el tipo DataSet (así como sus clases derivadas) implementan la interfaz IXmlSerializable y, por tanto, se ajustan a esta categoría. Para obtener más información, consulte Tipos 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 WCF en el modo Confianza parcial, la serialización y deserialización de los campos
readonly
(tantopublic
comoprivate
) no es compatible. Esto se debe a que el IL generado no se puede comprobar y, por consiguiente, requiere permisos elevados.Tanto DataContractSerializer como XmlSerializer se admiten en un entorno de confianza parcial. Sin embargo, el uso de DataContractSerializer está sujeto a las condiciones siguientes:
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 camposreadonly
cuando se ejecuta WCF en una aplicación de confianza parcial.El atributo
[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 de 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 de valor que admite un valor 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 que usan XmlSerializer y los servicios web ASP.NET. En particular, no admite atributos como XmlElementAttribute y XmlAttributeAttribute. Para habilitar la compatibilidad de este modelo de programación, WCF se debe modificar 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 queDBNull
es un tipo serializable, exige permiso SerializationFormatter .