Referência de esquema de contrato de dados
Este tópico descreve o subconjunto do esquema XML (XSD) usado para DataContractSerializer descrever tipos CLR (Common Language Runtime) para serialização XML.
Mapeamentos DataContractSerializer
O DataContractSerializer
mapeia tipos CLR para XSD quando os metadados são exportados de um serviço WCF (Windows Communication Foundation) usando um ponto de extremidade de metadados ou a ServiceModel Metadata Utility Tool (Svcutil.exe). Para obter mais informações, consulte Data Contract Serializer.
O DataContractSerializer
também mapeia XSD para tipos CLR quando Svcutil.exe é usado para acessar documentos WSDL (Web Services Description Language) ou XSD e gerar contratos de dados para serviços ou clientes.
Somente instâncias de esquema XML que estão em conformidade com os requisitos declarados neste documento podem ser mapeadas para tipos CLR usando DataContractSerializer
.
Níveis de Suporte
O DataContractSerializer
fornece os seguintes níveis de suporte para um determinado recurso de esquema XML:
Suportado. Há mapeamento explícito desse recurso para tipos ou atributos CLR (ou ambos) usando
DataContractSerializer
.Ignorado. O recurso é permitido em esquemas importados pelo
DataContractSerializer
, mas não tem efeito na geração de código.Proibido. O
DataContractSerializer
não suporta a importação de um esquema usando o recurso. Por exemplo, Svcutil.exe, ao acessar um WSDL com um esquema que usa esse recurso, volta a usar o XmlSerializer em vez disso. Isso ocorre por padrão.
Informações Gerais
O namespace do esquema é descrito em Esquema XML. O prefixo "xs" é usado neste documento.
Todos os atributos com um namespace que não seja de esquema são ignorados.
Todas as anotações (exceto as descritas neste documento) são ignoradas.
<xs:esquema>: atributos
Atributo | DataContract |
---|---|
attributeFormDefault |
Ignorado. |
blockDefault |
Ignorado. |
elementFormDefault |
Deve ser qualificado. Todos os elementos devem ser qualificados para que um esquema seja suportado pelo DataContractSerializer . Isso pode ser feito definindo xs:schema/@elementFormDefault como "qualificado" ou definindo xs:element/@form como "qualificado" em cada declaração de elemento individual. |
finalDefault |
Ignorado. |
Id |
Ignorado. |
targetNamespace |
Com suporte e mapeado para o namespace do contrato de dados. Se esse atributo não for especificado, o namespace em branco será usado. Não pode ser o namespace http://schemas.microsoft.com/2003/10/Serialization/ reservado . |
version |
Ignorado. |
<xs:esquema>: conteúdo
Conteúdos | Esquema |
---|---|
include |
Suportado. DataContractSerializer suporta xs:include e xs:import. No entanto, Svcutil.exe restringe o seguimento xs:include/@schemaLocation e xs:import/@location as referências quando os metadados são carregados de um arquivo local. A lista de arquivos de esquema deve ser passada através de um mecanismo fora de banda e não através include neste caso; include d documentos de esquema são ignorados. |
redefine |
Proibido. O uso de é proibido por razões de xs:redefine segurança: x:redefine requer schemaLocation ser seguido.DataContractSerializer Em determinadas circunstâncias, Svcutil.exe usando DataContract restringe o uso do schemaLocation . |
import |
Suportado. DataContractSerializer suportes xs:include e xs:import . No entanto, Svcutil.exe restringe o seguimento xs:include/@schemaLocation e xs:import/@location as referências quando os metadados são carregados de um arquivo local. A lista de arquivos de esquema deve ser passada através de um mecanismo fora de banda e não através include neste caso; include d documentos de esquema são ignorados. |
simpleType |
Suportado. Consulte a xs:simpleType secção. |
complexType |
Suportado, mapas para contratos de dados. Consulte a xs:complexType secção. |
group |
Ignorado. DataContractSerializer não suporta a utilização de xs:group , xs:attributeGroup e xs:attribute . Essas declarações são ignoradas como filhos de xs:schema , mas não podem ser referenciadas de dentro complexType ou de outras construções suportadas. |
attributeGroup |
Ignorado. DataContractSerializer não suporta a utilização de xs:group , xs:attributeGroup e xs:attribute . Essas declarações são ignoradas como filhos de xs:schema , mas não podem ser referenciadas de dentro complexType ou de outras construções suportadas. |
element |
Suportado. Consulte Declaração Global de Elementos (GED). |
attribute |
Ignorado. DataContractSerializer não suporta a utilização de xs:group , xs:attributeGroup e xs:attribute . Essas declarações são ignoradas como filhos de xs:schema , mas não podem ser referenciadas de dentro complexType ou de outras construções suportadas. |
notation |
Ignorado. |
Tipos complexos – <xs:complexType>
Informações Gerais
Cada tipo <complexo xs:complexType> é mapeado para um contrato de dados.
<xs:complexType>: atributos
Atributo | Esquema |
---|---|
abstract |
Deve ser falso (padrão). |
block |
Proibido. |
final |
Ignorado. |
id |
Ignorado. |
mixed |
Deve ser falso (padrão). |
name |
Suportado e mapeado para o nome do contrato de dados. Se houver pontos no nome, é feita uma tentativa de mapear o tipo para um tipo interno. Por exemplo, um tipo complexo chamado A.B mapeia para um tipo de contrato de dados que é um tipo interno de um tipo com o nome A do contrato de dados, mas somente se esse tipo de contrato de dados existir. Mais de um nível de nidificação é possível: por exemplo, A.B.C pode ser um tipo interno, mas apenas se A e A.B ambos existirem. |
<xs:complexType>: conteúdo
Conteúdos | Esquema |
---|---|
simpleContent |
Extensões são proibidas. A restrição só é permitida a partir de anySimpleType . |
complexContent |
Suportado. Ver "Herança". |
group |
Proibido. |
all |
Proibido. |
choice |
Proibido |
sequence |
Com suporte, mapeia para membros de dados de um contrato de dados. |
attribute |
Proibido, mesmo que use="proibido" (com uma exceção). Somente atributos opcionais do namespace Esquema de Serialização Padrão são suportados. Eles não mapeiam para membros de dados no modelo de programação de contrato de dados. Atualmente, apenas um desses atributos tem significado e é discutido na seção ISerializable. Todos os outros são ignorados. |
attributeGroup |
Proibido. Na versão WCF v1, DataContractSerializer ignora a presença de dentro xs:complexType do attributeGroup . |
anyAttribute |
Proibido. |
(vazio) | Mapeia para um contrato de dados sem membros de dados. |
<xs:sequência> em um tipo complexo: atributos
Atributo | Esquema |
---|---|
id |
Ignorado. |
maxOccurs |
Deve ser 1 (padrão). |
minOccurs |
Deve ser 1 (padrão). |
<xs:sequência> em um tipo complexo: conteúdo
Conteúdos | Esquema |
---|---|
element |
Cada instância é mapeada para um membro de dados. |
group |
Proibido. |
choice |
Proibido. |
sequence |
Proibido. |
any |
Proibido. |
(vazio) | Mapeia para um contrato de dados sem membros de dados. |
Elementos – <xs:element>
Informações Gerais
<xs:element>
pode ocorrer nos seguintes contextos:
Pode ocorrer dentro de um
<xs:sequence>
, que descreve um membro de dados de um contrato de dados regular (não coleta). Neste caso, omaxOccurs
atributo deve ser 1. (Não é permitido um valor de 0).Pode ocorrer dentro de um
<xs:sequence>
, que descreve um membro de dados de um contrato de dados de coleta. Neste caso, omaxOccurs
atributo deve ser maior que 1 ou "ilimitado".Pode ocorrer dentro de uma
<xs:schema>
Declaração de Elemento Global (GED).
<xs:element> com maxOccur=1 dentro de um <xs:sequence> (Membros de Dados)
Atributo | Esquema |
---|---|
ref |
Proibido. |
name |
Com suporte, mapeia para o nome do membro de dados. |
type |
Com suporte, mapeia para o tipo de membro de dados. Para obter mais informações, consulte Mapeamento de tipo/primitivo. Se não especificado (e o elemento não contém um tipo anônimo), xs:anyType é assumido. |
block |
Ignorado. |
default |
Proibido. |
fixed |
Proibido. |
form |
Deve ser qualificado. Este atributo pode ser definido através de elementFormDefault xs:schema . |
id |
Ignorado. |
maxOccurs |
1 |
minOccurs |
Mapeia para a IsRequired propriedade de um membro de dados (IsRequired é true quando minOccurs é 1). |
nillable |
Afeta o mapeamento de tipos. Consulte Mapeamento de tipo/primitivo. |
<xs:elemento> com maxOccurs>1 dentro de um <xs:sequence> (Coleções)
Mapeia para um CollectionDataContractAttributearquivo .
Em tipos de coleção, apenas um xs:element é permitido dentro de uma sequência xs:.
As coleções podem ser dos seguintes tipos:
Coleções regulares (por exemplo, matrizes).
Coleções de dicionários (mapeamento de um valor para outro; por exemplo, um Hashtable).
A única diferença entre um dicionário e uma matriz de um tipo de par chave/valor está no modelo de programação gerado. Há um mecanismo de anotação de esquema que pode ser usado para indicar que um determinado tipo é uma coleção de dicionário.
As regras para os ref
atributos , , block
default
, fixed
, form
, e id
são as mesmas que para o caso de não cobrança. Outros atributos incluem os da tabela a seguir.
Atributo | Esquema |
---|---|
name |
Com suporte, mapeia para a ItemName propriedade no CollectionDataContractAttribute atributo. |
type |
Com suporte, mapeia para o tipo armazenado na coleção. |
maxOccurs |
Maior que 1 ou "ilimitado". O esquema DC deve usar "unbounded". |
minOccurs |
Ignorado. |
nillable |
Afeta o mapeamento de tipos. Este atributo é ignorado para coleções de dicionários. |
<xs:element> dentro de uma <declaração de elemento global xs:schema>
Uma Declaração de Elemento Global (GED) que tem o mesmo nome e namespace que um tipo no esquema, ou que define um tipo anônimo dentro de si mesmo, é considerada associada ao tipo.
Exportação de esquema: GEDs associados são gerados para cada tipo gerado, simples e complexo.
Desserialização/serialização: GEDs associados são usados como elementos raiz para o tipo.
Importação de esquema: GEDs associados não são necessários e são ignorados se seguirem as seguintes regras (a menos que definam tipos).
Atributo | Esquema |
---|---|
abstract |
Deve ser falso para GEDs associados. |
block |
Proibido em GEDs associados. |
default |
Proibido em GEDs associados. |
final |
Deve ser falso para GEDs associados. |
fixed |
Proibido em GEDs associados. |
id |
Ignorado. |
name |
Suportado. Ver a definição de GED associado. |
nillable |
Deve ser verdadeiro para GEDs associados. |
substitutionGroup |
Proibido em GEDs associados. |
type |
Suportado e deve corresponder ao tipo associado para GEDs associados (a menos que o elemento contenha um tipo anônimo). |
<xs:elemento>: conteúdo
Conteúdos | Esquema |
---|---|
simpleType |
Suportado.* |
complexType |
Suportado.* |
unique |
Ignorado. |
key |
Ignorado. |
keyref |
Ignorado. |
(em branco) | Suportado. |
* Ao usar o simpleType
e complexType
, o mapeamento para tipos anônimos é o mesmo que para tipos não anônimos, exceto que não há contratos de dados anônimos e, portanto, um contrato de dados nomeado é criado, com um nome gerado derivado do nome do elemento. As regras para tipos anônimos estão na lista a seguir:
Detalhe da implementação do WCF: Se o
xs:element
nome não contiver pontos, o tipo anônimo será mapeado para um tipo interno do tipo de contrato de dados externo. Se o nome contiver pontos, o tipo de contrato de dados resultante será independente (não um tipo interno).O nome do contrato de dados gerado do tipo interno é o nome do contrato de dados do tipo externo seguido por um ponto, o nome do elemento e a cadeia de caracteres "Type".
Se já existir um contrato de dados com esse nome, o nome torna-se exclusivo anexando "1", "2", "3" e assim por diante até que um nome exclusivo seja criado.
Tipos simples - <xs:simpleType>
<xs:simpleType>: atributos
Atributo | Esquema |
---|---|
final |
Ignorado. |
id |
Ignorado. |
name |
Com suporte, mapeia para o nome do contrato de dados. |
<xs:simpleType>: conteúdo
Conteúdos | Esquema |
---|---|
restriction |
Suportado. Mapeia para contratos de dados de enumeração. Esse atributo será ignorado se não corresponder ao padrão de enumeração. Consulte a secção de xs:simpleType restrições. |
list |
Suportado. Mapeia para sinalizar contratos de dados de enumeração. Consulte a secção de xs:simpleType listas. |
union |
Proibido. |
<xs:restrição>
Restrições de tipo complexo são suportadas apenas para base="
xs:anyType
".Restrições de tipo simples que não têm nenhuma faceta de restrição além de
xs:enumeration
serem mapeadas para contratos de dados dexs:string
enumeração.Todas as outras restrições de tipo simples são mapeadas para os tipos que elas restringem. Por exemplo, uma restrição de
xs:int
mapas a um inteiro, assim comoxs:int
ele mesmo. Para obter mais informações sobre mapeamento de tipo primitivo, consulte Mapeamento de tipo/primitivo.
<xs:restrição>: atributos
Atributo | Esquema |
---|---|
base |
Deve ser um tipo simples suportado ou xs:anyType . |
id |
Ignorado. |
<xs:restrição> para todos os outros casos: conteúdo
Conteúdos | Esquema |
---|---|
simpleType |
Se presente, deve ser derivado de um tipo primitivo suportado. |
minExclusive |
Ignorado. |
minInclusive |
Ignorado. |
maxExclusive |
Ignorado. |
maxInclusive |
Ignorado. |
totalDigits |
Ignorado. |
fractionDigits |
Ignorado. |
length |
Ignorado. |
minLength |
Ignorado. |
maxLength |
Ignorado. |
enumeration |
Ignorado. |
whiteSpace |
Ignorado. |
pattern |
Ignorado. |
(em branco) | Suportado. |
Enumeração
<xs:restrição> para enumerações: atributos
Atributo | Esquema |
---|---|
base |
Se presente, deve ser xs:string . |
id |
Ignorado. |
<xs:restrição> para enumerações: conteúdo
Conteúdos | Esquema |
---|---|
simpleType |
Se presente, deve ser uma restrição de enumeração suportada pelo contrato de dados (esta seção). |
minExclusive |
Ignorado. |
minInclusive |
Ignorado. |
maxExclusive |
Ignorado. |
maxInclusive |
Ignorado. |
totalDigits |
Ignorado. |
fractionDigits |
Ignorado. |
length |
Proibido. |
minLength |
Proibido. |
maxLength |
Proibido. |
enumeration |
Suportado. A enumeração "id" é ignorada e "value" mapeia para o nome do valor no contrato de dados de enumeração. |
whiteSpace |
Proibido. |
pattern |
Proibido. |
(vazio) | Com suporte, mapeia para o tipo de enumeração vazio. |
O código a seguir mostra uma classe de enumeração C#.
public enum MyEnum
{
first = 3,
second = 4,
third =5
}
Esta classe é mapeada DataContractSerializer
para o esquema a seguir pelo . Se os valores de enumeração começarem a partir de 1, xs:annotation
os blocos não serão gerados.
<xs:simpleType name="MyEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="first">
<xs:annotation>
<xs:appinfo>
<EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
3
</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="second">
<xs:annotation>
<xs:appinfo>
<EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
4
</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:lista>
DataContractSerializer
Mapeia tipos de enumeração marcados com System.FlagsAttribute
a xs:list
derivada de xs:string
. Nenhuma outra xs:list
variação é suportada.
<xs:lista>: atributos
Atributo | Esquema |
---|---|
itemType |
Proibido. |
id |
Ignorado. |
<xs:lista>: conteúdo
Conteúdos | Esquema |
---|---|
simpleType |
Deve ser restrição de uso xs:enumeration de xs:string faceta. |
Se o xs:annotation/xs:appInfo/ser:EnumerationValue
valor de enumeração não seguir uma potência de progressão 2 (padrão para Flags), o valor será armazenado no elemento .
Por exemplo, o código a seguir sinaliza um tipo de enumeração.
[Flags]
public enum AuthFlags
{
AuthAnonymous = 1,
AuthBasic = 2,
AuthNTLM = 4,
AuthMD5 = 16,
AuthWindowsLiveID = 64,
}
Esse tipo é mapeado para o esquema a seguir.
<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="http://schemas.microsoft.com/2003/10/Serialization/">16</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="AuthWindowsLiveID">
<xs:annotation>
<xs:appinfo>
<EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">64</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
Herança
Regras gerais
Um contrato de dados pode herdar de outro contrato de dados. Esses contratos de dados são mapeados para uma base e são derivados por tipos de extensão usando a construção do <xs:extension>
esquema XML.
Um contrato de dados não pode herdar de um contrato de dados de coleta.
Por exemplo, o código a seguir é um contrato de dados.
[DataContract]
public class Person
{
[DataMember]
public string Name;
}
[DataContract]
public class Employee : Person
{
[DataMember]
public int ID;
}
Este contrato de dados é mapeado para a seguinte declaração de tipo de esquema XML.
<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 |
Ignorado. |
mixed |
Deve ser falso. |
<xs:complexContent>: conteúdo
Conteúdos | Esquema |
---|---|
restriction |
Proibido, exceto quando base="xs:anyType ". Este último equivale a colocar o xs:restriction conteúdo do diretamente sob o recipiente do xs:complexContent . |
extension |
Suportado. Mapeia para herança de contrato de dados. |
<xs:extensão> em <xs:complexContent>: atributos
Atributo | Esquema |
---|---|
id |
Ignorado. |
base |
Suportado. Mapeia para o tipo de contrato de dados base do qual esse tipo herda. |
<xs:extensão> em <xs:complexContent>: conteúdo
As regras são as mesmas que para <xs:complexType>
os conteúdos.
Se um <xs:sequence>
for fornecido, seus elementos de membro serão mapeados para membros de dados adicionais que estão presentes no contrato de dados derivados.
Se um tipo derivado contiver um elemento com o mesmo nome de um elemento em um tipo base, a declaração de elemento duplicado será mapeada para um membro de dados com um nome gerado para ser exclusivo. Números inteiros positivos são adicionados ao nome do membro de dados ("member1", "member2" e assim por diante) até que um nome exclusivo seja encontrado. Inversamente:
Se um contrato de dados derivado tiver um membro de dados com o mesmo nome e tipo que um membro de dados em um contrato de dados de base,
DataContractSerializer
gerará esse elemento correspondente no tipo derivado.Se um contrato de dados derivado tiver um membro de dados com o mesmo nome que um membro de dados em um contrato de dados base, mas um tipo diferente, o
DataContractSerializer
importará um esquema com um elemento do tipoxs:anyType
em declarações de tipo base e tipo derivado. O nome do tipo original é preservado emxs:annotations/xs:appInfo/ser:ActualType/@Name
.
Ambas as variações podem levar a um esquema com um modelo de conteúdo ambíguo, que depende da ordem dos respetivos membros de dados.
Mapeamento de tipo/primitivo
O DataContractSerializer
usa o seguinte mapeamento para tipos primitivos de esquema XML.
Tipo XSD | Tipo .NET |
---|---|
anyType |
Object. |
anySimpleType |
String. |
duration |
TimeSpan. |
dateTime |
DateTime. |
dateTimeOffset |
DateTime e TimeSpan para a compensação. Consulte Serialização DateTimeOffset abaixo. |
time |
String. |
date |
String. |
gYearMonth |
String. |
gYear |
String. |
gMonthDay |
String. |
gDay |
String. |
gMonth |
String. |
boolean |
Boolean |
base64Binary |
Byte matriz. |
hexBinary |
String. |
float |
Single. |
double |
Double. |
anyURI |
Uri. |
QName |
XmlQualifiedName. |
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 |
Decimal. |
integer |
Int64. |
nonPositiveInteger |
Int64. |
negativeInteger |
Int64. |
long |
Int64. |
int |
Int32. |
short |
Int16. |
Byte |
SByte. |
nonNegativeInteger |
Int64. |
unsignedLong |
UInt64. |
unsignedInt |
UInt32. |
unsignedShort |
UInt16. |
unsignedByte |
Byte. |
positiveInteger |
Int64. |
Mapeamento de tipos ISerializable
No .NET Framework versão 1.0, ISerializable foi introduzido como um mecanismo geral para serializar objetos para persistência ou transferência de dados. Há muitos tipos de .NET Framework que implementam ISerializable
e que podem ser passados entre aplicativos. DataContractSerializer naturalmente fornece suporte para ISerializable
as aulas. Os DataContractSerializer
tipos de esquema de implementação de mapas ISerializable
que diferem apenas pelo QName (nome qualificado) do tipo e são efetivamente coleções de propriedades. Por exemplo, o DataContractSerializer
mapeia Exception para o seguinte tipo XSD no http://schemas.datacontract.org/2004/07/System
namespace.
<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>
O atributo ser:FactoryType
opcional declarado no esquema de serialização de contrato de dados faz referência a uma classe de fábrica que pode desserializar o tipo. A classe de fábrica deve fazer parte da coleção de tipos conhecidos da instância que está sendo DataContractSerializer
usada. Para obter mais informações sobre tipos conhecidos, consulte Tipos conhecidos de contrato de dados.
Esquema de serialização DataContract
Vários esquemas exportados pelos DataContractSerializer
tipos de uso, elementos e atributos de um namespace especial de Serialização de Contrato de Dados:
http://schemas.microsoft.com/2003/10/Serialization
A seguir está uma declaração completa de esquema de serialização de contrato de dados.
<xs:schema attributeFormDefault="qualified"
elementFormDefault="qualified"
targetNamespace =
"http://schemas.microsoft.com/2003/10/Serialization/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://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>
Deve notar-se o seguinte:
ser:char
é introduzido para representar caracteres Unicode do tipo Char.O
valuespace
de é reduzido a um conjunto ordenado para que possa ser mapeadoxs:duration
para um TimeSpan.FactoryType
é usado em esquemas exportados de tipos derivados de ISerializable.
Importando esquemas não-DataContract
DataContractSerializer
tem a opção de permitir a ImportXmlTypes
importação de esquemas que não estão em conformidade com o DataContractSerializer
perfil XSD (consulte a Options propriedade). Definir essa opção para permitir a true
aceitação de tipos de esquema não conformes e mapeá-los para a implementação a seguir, IXmlSerializable encapsulando uma matriz de (somente o nome da XmlNode classe difere).
[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;
}
}
Serialização DateTimeOffset
O DateTimeOffset não é tratado como um tipo primitivo. Em vez disso, ele é serializado como um elemento complexo com duas partes. A primeira parte representa a data hora e a segunda parte representa o deslocamento da data hora. Um exemplo de um valor DateTimeOffset serializado é mostrado no código a seguir.
<OffSet xmlns:a="http://schemas.datacontract.org/2004/07/System">
<DateTime i:type="b:dateTime" xmlns=""
xmlns:b="http://www.w3.org/2001/XMLSchema">2008-08-28T08:00:00
</DateTime>
<OffsetMinutes i:type="b:short" xmlns=""
xmlns:b="http://www.w3.org/2001/XMLSchema">-480
</OffsetMinutes>
</OffSet>
O esquema é o seguinte.
<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:element name="OffsetMinutes" type="xs:short"
minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:schema>