Referencia de esquema de contrato de datos
En este tema se describe el subconjunto del esquema XML (XSD) que DataContractSerializer usa para describir los tipos de Common Language Runtime (CLR) para la serialización XML.
Asignaciones de DataContractSerializer
El DataContractSerializer asigna tipos CLR a XSD cuando los metadatos se exportan desde un servicio de Windows Communication Foundation (WCF) utilizando un extremo de metadatos o la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe). Para obtener más información, vea El serializador de contratos de datos.
El DataContractSerializer también asigna XSD a tipos de CLR cuando Svcutil.exe se utiliza para tener acceso al lenguaje de descripción de servicios Web (WSDL) o documentos XSD y para generar contratos de datos para servicios o clientes.
Solo las instancias de esquema XML que cumplen los requisitos mencionados en este documento pueden asignarse a tipos de CLR utilizando DataContractSerializer.
Niveles de compatibilidad
El DataContractSerializer proporciona los niveles siguientes de compatibilidad para una característica de esquema XML determinada:
Compatible. Hay asignación explícita desde esta característica a tipos o atributos CLR (o a ambos) mediante DataContractSerializer.
Se omite. La característica se permite en esquemas importados por el DataContractSerializer, pero no tiene ningún efecto sobre la generación de código.
Se prohíbe. El DataContractSerializer no permite importar un esquema mediante la característica. Por ejemplo, Svcutil.exe, al obtener acceso a un WSDL con un esquema que utiliza esta característica, vuelve a utilizar el XmlSerializer en su lugar. Esto sucede de forma predeterminada.
Información general
El espacio de nombres del esquema se describe en Esquema XML. El prefijo "xs" se utiliza en este documento.
Cualquier atributo con un espacio de nombres que no sea del esquema Se ignora.
Se omite cualquier anotación (excepto aquellas descritas en este documento).
<xs:schema>: atributos
Atributo | DataContract |
---|---|
attributeFormDefault |
Se ignora. |
blockDefault |
Se ignora. |
elementFormDefault |
Se debe calificar. Todos los elementos se deben calificar para un esquema para que DataContractSerializer los admita. Esto puede lograrse estableciendo xs:schema/@elementFormDefault en "qualified" o estableciendo xs:element/@form en "qualified" en cada declaración de elemento individual. |
finalDefault |
Se ignora. |
Id |
Se ignora. |
targetNamespace |
Admitido y asignado al espacio de nombres del contrato de datos. Si no se especifica este atributo, se utiliza el espacio de nombres en blanco. No puede ser el espacio de nombres https://schemas.microsoft.com/2003/10/Serialization/ reservado. |
version |
Se ignora. |
<xs:schema>: contenido
Contenido | Esquema |
---|---|
include |
Admitido. DataContractSerializer admite xs:include y xs:import. Sin embargo, Svcutil.exe restringe las siguientes referencias xs:include/@schemaLocation y xs:import/@location cuando los metadatos se cargan desde un archivo local. La lista de archivos de esquema se debe pasar mediante un mecanismo fuera de banda y no mediante include en este caso; los documentos de esquema include se omiten. |
redefine |
Prohibido. El uso de xs:redefine se prohíbe por parte de DataContractSerializer por razones de seguridad: x:redefine requiere que se siga schemaLocation. En ciertas circunstancias, el uso de DataContract por parte de Svcutil.exe restringe el uso de schemaLocation. |
import |
Admitido. DataContractSerializer admite xs:include y xs:import. Sin embargo, Svcutil.exe restringe las siguientes referencias xs:include/@schemaLocation y xs:import/@location cuando los metadatos se cargan desde un archivo local. La lista de archivos de esquema se debe pasar mediante un mecanismo fuera de banda y no mediante include en este caso; los documentos de esquema include se omiten. |
simpleType |
Admitido. Vea la sección xs:simpleType. |
complexType |
Admitido, se asigna a contratos de datos. Vea la sección xs:complexType. |
group |
Se ignora. DataContractSerializer no admite el uso de xs:group, xs:attributeGroup ni xs:attribute. Estas declaraciones se omiten como elementos secundarios de xs:schema, pero no se puede hacer referencia a ellas desde dentro de complexType u otras estructuras admitidas. |
attributeGroup |
Se ignora. DataContractSerializer no admite el uso de xs:group, xs:attributeGroup ni xs:attribute. Estas declaraciones se omiten como elementos secundarios de xs:schema, pero no se puede hacer referencia a ellas desde dentro de complexType u otras estructuras admitidas. |
element |
Admitido. Vea la declaración de elemento global (GED). |
attribute |
Se ignora. DataContractSerializer no admite el uso de xs:group, xs:attributeGroup ni xs:attribute. Estas declaraciones se ignoran como elementos secundarios de xs:schema, pero no se puede hacer referencia a ellas desde complexType u otras estructuras admitidas. |
notation |
Se ignora. |
Tipos complejos: <xs:complexType>
Información general
Cada tipo complejo <xs:complexType> se asigna a un contrato de datos.
<xs:complexType>: atributos
Atributo | Esquema |
---|---|
abstract |
Debe ser false (valor predeterminado). |
block |
Prohibido. |
final |
Se ignora. |
id |
Se ignora. |
mixed |
Debe ser false (valor predeterminado). |
name |
Admitido y asignado al nombre del contrato de datos. Si hay puntos en el nombre, se realiza un intento de asignar el tipo a un tipo interno. Por ejemplo, un tipo complejo denominado A.B asigna a un tipo de contrato de datos que es un tipo interno de un tipo con el nombre de contrato de datos A, pero solo si existe este tipo de contrato de datos. Es posible más de un nivel de anidación: por ejemplo, A.B.C puede ser un tipo interno, pero solo si existen A y A.B. |
<xs:complexType>: contenido
Contenido | Esquema |
---|---|
simpleContent |
Se prohíben las extensiones. La restricción solo se permite desde anySimpleType. |
complexContent |
Admitido. Vea “Herencia”. |
group |
Prohibido. |
all |
Prohibido. |
choice |
Prohibido |
sequence |
Admitido, asigna a los miembros de datos de un contrato de datos. |
attribute |
Prohibido, aun cuando uso = "prohibido" (con una excepción). Solo se admiten los atributos opcionales del espacio de nombres del esquema de serialización estándar. No asignan a miembros de datos en el modelo de programación del contrato de datos. Actualmente, solo un atributo de este tipo tiene significado y se trata en la sección ISerializable. El resto se pasa por alto. |
attributeGroup |
Prohibido. En la versión v1 de WCF, DataContractSerializer omite la presencia de attributeGroup dentro de xs:complexType. |
anyAttribute |
Prohibido. |
(vacío) |
Asigna a un contrato de datos sin miembros de datos. |
<xs:sequence> en un tipo complejo: atributos
Atributo | Esquema |
---|---|
id |
Se ignora. |
maxOccurs |
Debe ser 1 (valor predeterminado). |
minOccurs |
Debe ser 1 (valor predeterminado). |
<xs:sequence> en un tipo complejo: contenido
Contenido | Esquema |
---|---|
element |
Cada instancia asigna a un miembro de datos. |
group |
Prohibido. |
choice |
Prohibido. |
sequence |
Prohibido. |
any |
Prohibido. |
(vacío) |
Se asigna a un contrato de datos sin miembros de datos. |
Elementos: <xs:element>
Información general
<xs:element> puede aparecer en los contextos siguientes:
Puede ocurrir dentro de un <xs:sequence>, que describe un miembro de datos de un contrato de datos normal (no de una colección). En este caso, el atributo maxOccurs debe ser 1. (No se permite un valor de 0).
Puede ocurrir dentro de un <xs:sequence>, que describe un miembro de datos de un contrato de datos de colección. En este caso, el atributo maxOccurs debe ser mayor que 1 o "ilimitado".
Puede ocurrir dentro de <xs:schema> como una declaración de elemento global (GED).
<xs:element> con maxOccurs=1 dentro de un <xs:sequence> (miembros de datos)
Atributo | Esquema |
---|---|
ref |
Prohibido. |
name |
Admitido, asigna al nombre del miembro de datos. |
type |
Admitido, asigna al tipo de miembro de datos. Para obtener más información, vea Asignación de tipo/primitivo. Si no se especifica (y el elemento no contiene un tipo anónimo), se supone xs:anyType. |
block |
Se ignora. |
default |
Prohibido. |
fixed |
Prohibido. |
form |
Se debe calificar. Este atributo se puede establecer mediante elementFormDefault en xs:schema. |
id |
Se ignora. |
maxOccurs |
1 |
minOccurs |
Se asigna a la propiedad IsRequired de un miembro de datos (IsRequired es true cuando minOccurs es 1). |
nillable |
Afecta a la asignación de tipo. Vea Asignación de tipo/primitivo. |
<xs:element> con maxOccurs>1 dentro de un <xs:sequence> (Colecciones)
Asigna a un CollectionDataContractAttribute.
En tipos de colección, solo se permite un xs:element dentro de un xs:sequence.
Las colecciones pueden ser de los siguientes tipos:
Colecciones normales (por ejemplo, matrices).
Colecciones de diccionarios (asignan un valor a otro; por ejemplo, un Hashtable).
- La única diferencia entre un diccionario y una matriz de un tipo de par clave-valor está en el modelo de programación generado. Hay un mecanismo de anotación de esquema que se puede utilizar para indicar que un tipo determinado es una colección de diccionarios.
Las reglas para los atributos ref, block, default, fixed, form e id son las mismas que para el caso de que no se trate de una colección. Entre otros atributos se incluyen los de la tabla siguiente.
Atributo | Esquema |
---|---|
name |
Admitido, asigna a la propiedad ItemName en el atributo CollectionDataContractAttribute. |
type |
Admitido, asigna al tipo almacenado en la colección. |
maxOccurs |
Mayor que 1 o "ilimitado". El esquema de DC debería utilizar "ilimitado." |
minOccurs |
Se ignora. |
nillable |
Afecta a la asignación de tipo. Este atributo se omite para las colecciones de diccionarios. |
<xs:element> dentro de un <xs:schema> declaración de elemento global
Una declaración de elemento global (GED) que tiene el mismo nombre y espacio de nombres que un tipo en esquema o que define un tipo anónimo dentro de sí mismo, se dice que está asociado al tipo.
Exportación del esquema: las GED asociadas se generan para cada tipo generado, tanto simple como complejo.
Deserialización/serialización: las GED asociadas se utilizan como elementos raíz para el tipo.
Importación del esquema: las GED asociadas no se requieren y se omiten si siguen las reglas siguientes (a menos que definan tipos).
Atributo | Esquema |
---|---|
abstract |
Debe ser false para GED asociadas. |
block |
Se prohíbe en GED asociadas. |
default |
Se prohíbe en GED asociadas. |
final |
Debe ser false para GED asociadas. |
fixed |
Se prohíbe en GED asociadas. |
id |
Se ignora. |
name |
Admitido. Vea la definición de GED asociadas. |
nillable |
Debe ser true para las GED asociadas. |
substitutionGroup |
Se prohíbe en GED asociadas. |
type |
Admitido y debe coincidir con el tipo asociado para las GED asociadas (a menos que el elemento contenga un tipo anónimo). |
<xs:element>: contenido
Contenido | Esquema |
---|---|
simpleType |
Admitido.* |
complexType |
Admitido.* |
unique |
Se ignora. |
key |
Se ignora. |
keyref |
Se ignora. |
(En blanco) |
Admitido. |
* Al utilizar simpleType y complexType, la asignación para tipos anónimos es igual que para los tipos no anónimos, salvo que no hay ningún contrato de datos anónimo y, por tanto, se crea un contrato de datos con nombre, con un nombre generado derivado del nombre de elemento. Las reglas para los tipos anónimos están en la lista siguiente:
Detalle de implementación de WCF: si el nombre de xs:element no contiene puntos, el tipo anónimo asigna a un tipo interno del tipo de contrato de datos exterior. Si el nombre contiene puntos, el tipo de contrato de datos resultante es independiente (no un tipo interno).
El nombre de contrato de datos generado del tipo interno es el nombre de contrato de datos del tipo exterior seguido por un punto, el nombre del elemento, y la cadena “Type”.
Si un contrato de datos con este tipo de nombre ya existe, el nombre se hace único anexando "1", "2", "3", y así sucesivamente, hasta que se cree un nombre único.
Tipos simples: <xs:simpleType>
<xs:simpleType>: atributos
Atributo | Esquema |
---|---|
final |
Se ignora. |
id |
Se ignora. |
name |
Admitido, asigna al nombre de contrato de datos. |
<xs:simpleType>: contenido
Contenido | Esquema |
---|---|
restriction |
Admitido. Asigna a contratos de datos de enumeración. Este atributo se omite si no coincide con el modelo de enumeración. Vea la sección de restricciones de xs:simpleType. |
list |
Admitido. Asigna a contratos de datos de enumeración de marcas. Vea la sección de listas de xs:simpleType. |
union |
Prohibido. |
<xs:restriction>
Las restricciones de tipos complejos solo se admiten para base = "xs:anyType".
Las restricciones de tipos simples de xs:string que no tienen facetas de restricciones que no sean xs:enumeration están asignadas a contratos de datos de enumeración.
El resto de restricciones de tipos simples se asignan a los tipos que restringen. Por ejemplo, una restricción de xs:int asigna a un entero, como lo hace xs:int. Para obtener más información sobre asignación de tipos primitivos, vea Asignación de tipo/primitivo.
<xs:restriction>: atributos
Atributo | Esquema |
---|---|
base |
Debe ser un tipo simple admitido o xs:anyType. |
id |
Se ignora. |
<xs:restriction> para el resto de casos: contenido
Contenido | Esquema |
---|---|
simpleType |
Si está presente, se debe derivar de un tipo primitivo admitido. |
minExclusive |
Se ignora. |
minInclusive |
Se ignora. |
maxExclusive |
Se ignora. |
maxInclusive |
Se ignora. |
totalDigits |
Se ignora. |
fractionDigits |
Se ignora. |
length |
Se ignora. |
minLength |
Se ignora. |
maxLength |
Se ignora. |
enumeration |
Se ignora. |
whiteSpace |
Se ignora. |
pattern |
Se ignora. |
(En blanco) |
Compatible. |
Enumeración
<xs:restriction> para enumeraciones: atributos
Atributo | Esquema |
---|---|
base |
Si está presente, debe ser xs:string. |
id |
Se ignora. |
<xs:restriction> para enumeraciones: contenido
Contenido | Esquema |
---|---|
simpleType |
Si está presente, debe ser una restricción de enumeración admitida por el contrato de datos (esta sección). |
minExclusive |
Se ignora. |
minInclusive |
Se ignora. |
maxExclusive |
Se ignora. |
maxInclusive |
Se ignora. |
totalDigits |
Se ignora. |
fractionDigits |
Se ignora. |
length |
Prohibido. |
minLength |
Prohibido. |
maxLength |
Prohibido. |
enumeration |
Compatible. Se omite el "id" de enumeración y "value" (valor) se asigna al nombre del valor en el contrato de datos de enumeración. |
whiteSpace |
Prohibido. |
pattern |
Prohibido. |
(vacío) |
Compatible; se asigna a un tipo de enumeración vacío. |
En el siguiente código se muestra una clase de enumeración de C#.
public enum MyEnum
{
first = 3,
second = 4,
third =5
}
Esta clase se asigna al esquema siguiente mediante el DataContractSerializer. Si los valores de la enumeración se inician en 1, no se generan bloques xs:annotation.
<xs:simpleType name="MyEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="first">
<xs:annotation>
<xs:appinfo>
<EnumerationValue
xmlns="https://schemas.microsoft.com/2003/10/Serialization/">
3
</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="second">
<xs:annotation>
<xs:appinfo>
<EnumerationValue
xmlns="https://schemas.microsoft.com/2003/10/Serialization/">
4
</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:list>
El DataContractSerializer asigna tipos de enumeración marcados con System.FlagsAttribute a xs:list derivado de xs:string. No se admite ninguna otra variación de xs:list.
<xs:list>: atributos
Atributo | Esquema |
---|---|
itemType |
Prohibido. |
id |
Se ignora. |
<xs:list>: contenido
Contenido | Esquema |
---|---|
simpleType |
Debe ser la restricción de xs:string utilizando la faceta xs:enumeration. |
Si el valor de enumeración no sigue una progresión de potencia 2 (valor predeterminado para marcas), el valor se almacena en xs:annotation/xs:appInfo/ser:EnumerationValue.
Por ejemplo, el código siguiente marca un tipo de enumeración.
[Flags]
public enum AuthFlags
{
AuthAnonymous = 1,
AuthBasic = 2,
AuthNTLM = 4,
AuthMD5 = 16,
AuthPassport = 64,
}
Este tipo asigna al esquema siguiente.
<xs:simpleType name="AuthFlags">
<xs:list>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="AuthAnonymous" />
<xs:enumeration value="AuthBasic" />
<xs:enumeration value="AuthNTLM" />
<xs:enumeration value="AuthMD5">
<xs:annotation>
<xs:appinfo>
<EnumerationValue xmlns="https://schemas.microsoft.com/2003/10/Se
rialization/">16</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="AuthPassport">
<xs:annotation>
<xs:appinfo>
<EnumerationValue xmlns="https://schemas.microsoft.com/2003/10/Se
rialization/">64</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
Herencia
Reglas Generales
Un contrato de datos puede heredar de otro contrato de datos. Tales contratos de datos asignan a una base y son derivados por tipos de extensión mediante la construcción de squema XML <xs:extension>.
Un contrato de datos no puede heredar de un contrato de datos de colección.
Por ejemplo, el código siguiente es un contrato de datos.
[DataContract]
public class Person
{
[DataMember]
public string Name;
}
[DataContract]
public class Employee : Person
{
[DataMember]
public int ID;
}
Este contrato de datos asigna a la declaración de tipos de esquema XML siguiente.
<xs:complexType name="Employee">
<xs:complexContent mixed="false">
<xs:extension base="tns:Person">
<xs:sequence>
<xs:element minOccurs="0" name="ID" type="xs:int"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Person">
<xs:sequence>
<xs:element minOccurs="0" name="Name"
nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexContent>: atributos
Atributo | Esquema |
---|---|
id |
Se ignora. |
mixed |
Debe ser false. |
<xs:complexContent>: contenido
Contenido | Esquema |
---|---|
restriction |
Prohibido, excepto cuando base = "xs:anyType". Lo último es equivalente a colocar directamente el contenido de xs:restriction bajo el contenedor de xs:complexContent. |
extension |
Se admite. Asigna a la herencia del contrato de datos. |
<xs:extension> en <xs:complexContent>: atributos
Atributo | Esquema |
---|---|
id |
Se ignora. |
base |
Se admite. Asigna al tipo de contrato de datos base desde el que este tipo hereda. |
<xs:extension> en <xs:complexContent>: contenido
Las reglas son la mismas que para el contenido <xs:complexType>.
Si se proporciona un <xs:sequence>, sus elementos de miembro asignan a los miembros de datos adicionales que se encuentran en el contrato de datos derivado.
Si un tipo derivado contiene un elemento con el mismo nombre que un elemento en un tipo base, la declaración de elementos duplicados asigna a un miembro de datos con un nombre que se genera para que sea único. Los números enteros positivos se suman al nombre del miembro de datos ("member1", "member2", etc.) hasta que se encuentre un nombre único. De manera inversa:
Si un contrato de datos derivado tiene un miembro de datos con el mismo nombre y tipo que un miembro de datos en un contrato de datos base, DataContractSerializer genera este elemento correspondiente en el tipo derivado.
Si un contrato de datos derivado tiene un miembro de datos con el mismo nombre que un miembro de datos en un contrato de datos base pero un tipo diferente, el DataContractSerializer importa un esquema con un elemento del tipo xs:anyType en las declaraciones de tipo base y de tipos derivados. El nombre de tipo original se conserva en xs:annotations/xs:appInfo/ser:ActualType/@Name.
Ambas variaciones pueden conducir a un esquema con un modelo de contenido ambiguo, que depende del orden de los miembros de datos respectivos.
Asignación de tipo/primitivo.
El DataContractSerializer utiliza la asignación siguiente para los tipos primitivos del esquema XML.
Tipo XSD | Tipo .NET |
---|---|
anyType |
|
anySimpleType |
|
duration |
|
dateTime |
|
dateTimeOffset |
DateTime y TimeSpan para el desplazamiento. Vea abajo Serialización de DateTimeOffset. |
time |
String. |
date |
String. |
gYearMonth |
String. |
gYear |
String. |
gMonthDay |
String. |
gDay |
String. |
gMonth |
String. |
boolean |
|
base64Binary |
Matriz de tipo Byte. |
hexBinary |
String. |
float |
|
double |
|
anyURI |
Uri. |
QName |
|
string |
String. |
normalizedString |
String. |
token |
String. |
language |
String. |
Name |
String. |
NCName |
String. |
ID |
String. |
IDREF |
String. |
IDREFS |
String. |
ENTITY |
String. |
ENTITIES |
String. |
NMTOKEN |
String. |
NMTOKENS |
String. |
decimal |
|
integer |
|
nonPositiveInteger |
Int64. |
negativeInteger |
Int64. |
long |
Int64. |
int |
|
short |
|
Byte |
|
nonNegativeInteger |
Int64. |
unsignedLong |
|
unsignedInt |
|
unsignedShort |
|
unsignedByte |
Byte. |
positiveInteger |
Int64. |
Asignación de tipos ISerializable
En la versión 1.0 de .NET Framework 1.0, ISerializable se introdujo como un mecanismo general para serializar objetos para proporcionar persistencia o transferencia de datos. Hay muchos tipos de .NET Framework implementan ISerializable y que pueden pasarse entre aplicaciones. DataContractSerializer proporciona de manera natural compatibilidad para las clases ISerializable. DataContractSerializer asigna tipos de esquema de implementación de ISerializable que solo difieren en cuanto al QName (nombre completo) del tipo y son colecciones de propiedades. Por ejemplo, el DataContractSerializer asigna Exception al tipo XSD siguiente en el espacio de nombres http://schemas.datacontract.org/2004/07/System.
<xs:complexType name="Exception">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded"
namespace="##local" processContents="skip"/>
</xs:sequence>
<xs:attribute ref="ser:FactoryType"/>
</xs:complexType>
El atributo opcional ser:FactoryType opcional declarado en el esquema de serialización de contrato de datos hace referencia a una clase de generador que puede deserializar el tipo. La clase de generador debe formar parte de la colección de tipos conocidos de la instancia DataContractSerializer que se está utilizando. Para obtener más información sobre tipos conocidos, vea Tipos conocidos de contratos de datos.
Esquema de serialización de DataContract
Varios esquemas exportados por los tipos de uso, elementos y atributos del DataContractSerializer, desde un espacio de nombres de serialización de contrato de datos especial:
https://schemas.microsoft.com/2003/10/Serialization
A continuación, se muestra una declaración de esquema de serialización de contrato de datos completa.
<xs:schema attributeFormDefault="qualified"
elementFormDefault="qualified"
targetNamespace =
"https://schemas.microsoft.com/2003/10/Serialization/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="https://schemas.microsoft.com/2003/10/Serialization/">
<!-- Top-level elements for primitive types. -->
<xs:element name="anyType" nillable="true" type="xs:anyType"/>
<xs:element name="anyURI" nillable="true" type="xs:anyURI"/>
<xs:element name="base64Binary"
nillable="true" type="xs:base64Binary"/>
<xs:element name="boolean" nillable="true" type="xs:boolean"/>
<xs:element name="byte" nillable="true" type="xs:byte"/>
<xs:element name="dateTime" nillable="true" type="xs:dateTime"/>
<xs:element name="decimal" nillable="true" type="xs:decimal"/>
<xs:element name="double" nillable="true" type="xs:double"/>
<xs:element name="float" nillable="true" type="xs:float"/>
<xs:element name="int" nillable="true" type="xs:int"/>
<xs:element name="long" nillable="true" type="xs:long"/>
<xs:element name="QName" nillable="true" type="xs:QName"/>
<xs:element name="short" nillable="true" type="xs:short"/>
<xs:element name="string" nillable="true" type="xs:string"/>
<xs:element name="unsignedByte"
nillable="true" type="xs:unsignedByte"/>
<xs:element name="unsignedInt"
nillable="true" type="xs:unsignedInt"/>
<xs:element name="unsignedLong"
nillable="true" type="xs:unsignedLong"/>
<xs:element name="unsignedShort"
nillable="true" type="xs:unsignedShort"/>
<!-- Primitive types introduced for certain .NET simple types. -->
<xs:element name="char" nillable="true" type="tns:char"/>
<xs:simpleType name="char">
<xs:restriction base="xs:int"/>
</xs:simpleType>
<!-- xs:duration is restricted to an ordered value space,
to map to System.TimeSpan -->
<xs:element name="duration" nillable="true" type="tns:duration"/>
<xs:simpleType name="duration">
<xs:restriction base="xs:duration">
<xs:pattern
value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?"/>
<xs:minInclusive value="-P10675199DT2H48M5.4775808S"/>
<xs:maxInclusive value="P10675199DT2H48M5.4775807S"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="guid" nillable="true" type="tns:guid"/>
<xs:simpleType name="guid">
<xs:restriction base="xs:string">
<xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}"/>
</xs:restriction>
</xs:simpleType>
<!-- This is used for schemas exported from ISerializable type. -->
<xs:attribute name="FactoryType" type="xs:QName"/>
</xs:schema>
Se debería tener en cuenta lo siguiente:
ser:char se introduce para representar caracteres Unicode de tipo Char.
El valuespace de xs:duration se reduce a un conjunto ordenado para que pueda asignarse a un TimeSpan.
FactoryType se utiliza en esquemas exportados a partir de tipos que se derivan de ISerializable.
Importación de esquemas no DataContract
DataContractSerializer tiene la opción ImportXmlTypes para permitir la importación de esquemas que no cumplen el perfil XSD DataContractSerializer (vea la propiedad Options ). Establecer esta opción en true habilita la aceptación de tipos de esquema no conformes y la asignación de ellos a la implementación siguiente, IXmlSerializable ajuste de una matriz de XmlNode (solo difiere el nombre de la clase).
[GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Xml.Serialization.XmlSchemaProviderAttribute("ExportSchema")]
[System.Xml.Serialization.XmlRootAttribute(IsNullable=false)]
public partial class Person : object, IXmlSerializable
{
private XmlNode[] nodesField;
private static XmlQualifiedName typeName =
new XmlQualifiedName("Person","http://Microsoft.ServiceModel.Samples");
public XmlNode[] Nodes
{
get {return this.nodesField;}
set {this.nodesField = value;}
}
public void ReadXml(XmlReader reader)
{
this.nodesField = XmlSerializableServices.ReadNodes(reader);
}
public void WriteXml(XmlWriter writer)
{
XmlSerializableServices.WriteNodes(writer, this.Nodes);
}
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public static XmlQualifiedName ExportSchema(XmlSchemaSet schemas)
{
XmlSerializableServices.AddDefaultSchema(schemas, typeName);
return typeName;
}
}
Serialización de DateTimeOffset
DateTimeOffset no se trata como un tipo primitivo. En su lugar, se serializa como un elemento complejo con dos partes. La primera parte representa la fecha y hora, y la segunda parte representa el desplazamiento de la fecha y hora. En el siguiente código se muestra un ejemplo de un valor DateTimeOffset serializado.
<OffSet xmlns:a="http://schemas.datacontract.org/2004/07/System">
<DateTime i:type="b:dateTime"
xmlns:b="http://www.w3.org/2001/XMLSchema">2008-08-28T08:00:00
</DateTime>
<OffsetMinutes i:type="b:short"
xmlns:b="http://www.w3.org/2001/XMLSchema">-480
</OffsetMinutes>
</OffSet>
El esquema es de la siguiente manera.
<xs:schema targetNamespace="http://schemas.datacontract.org/2004/07/System">
<xs:complexType name="DateTimeOffset">
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="DateTime" type="xs:dateTime"
minOccurs="1" maxOccurs="1" />
<xs:elementname="OffsetMinutes" type="xs:short"
minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Vea también
Referencia
DataContractSerializer
DataContractAttribute
DataMemberAttribute
XsdDataContractImporter