Referência do Esquema do Contrato de Dados
Este tópico descreve o subconjunto do Esquema XML (XSD) utilizado por DataContractSerializer para descrever tipos comuns de runtime de linguagem (CLR) para serialização XML.
Mapeamentos de DataContractSerializer
O DataContractSerializer
mapeia tipos de CLR para XSD quando os metadados são exportados de um serviço do Windows Communication Foundation (WCF) com um ponto final de metadados ou a ServiceModel Metadata Utility Tool (Svcutil.exe). Para obter mais informações, veja Serializador de Contratos de Dados.
O DataContractSerializer
também mapeia os tipos de XSD para CLR quando Svcutil.exe é utilizado para aceder a documentos WSDL (Web Services Description Language) ou XSD e gerar contratos de dados para serviços ou clientes.
Apenas as instâncias de Esquema XML em conformidade com os requisitos indicados neste documento podem ser mapeadas para tipos de CLR com DataContractSerializer
.
Níveis de Suporte
O DataContractSerializer
fornece os seguintes níveis de suporte para uma determinada funcionalidade de Esquema XML:
Suportado. Existe um mapeamento explícito desta funcionalidade para tipos ou atributos CLR (ou ambos) com
DataContractSerializer
.Ignorado. A funcionalidade é permitida em esquemas importados pelo
DataContractSerializer
, mas não tem qualquer efeito na geração de código.Proibido. O
DataContractSerializer
não suporta a importação de um esquema com a funcionalidade. Por exemplo, Svcutil.exe, ao aceder a um WSDL com um esquema que utiliza essa funcionalidade, volta a utilizar o XmlSerializer . Isto é por predefinição.
Informações Gerais
O espaço de nomes do esquema está descrito em Esquema XML. O prefixo "xs" é utilizado neste documento.
Todos os atributos com um espaço de nomes sem esquema são ignorados.
Todas as anotações (exceto as descritas neste documento) são ignoradas.
<xs:schema>: atributos
Atributo | DataContract |
---|---|
attributeFormDefault |
Ignorado. |
blockDefault |
Ignorado. |
elementFormDefault |
Tem de ser qualificado. Todos os elementos têm de ser qualificados para que um esquema seja suportado pelo DataContractSerializer . Isto pode ser feito ao definir xs:schema/@elementFormDefault como "qualificado" ou ao definir xs:element/@form como "qualificado" em cada declaração de elemento individual. |
finalDefault |
Ignorado. |
Id |
Ignorado. |
targetNamespace |
Suportado e mapeado para o espaço de nomes do contrato de dados. Se este atributo não for especificado, é utilizado o espaço de nomes em branco. Não pode ser o espaço de nomes http://schemas.microsoft.com/2003/10/Serialization/ reservado . |
version |
Ignorado. |
<xs:schema>: conteúdo
Conteúdos | Esquema |
---|---|
include |
Suportado. DataContractSerializer suporta xs:include e xs:import. No entanto, Svcutil.exe restringe o seguinte xs:include/@schemaLocation e xs:import/@location as referências quando os metadados são carregados a partir de um ficheiro local. A lista de ficheiros de esquema tem de ser transmitida através de um mecanismo fora de banda e não através include deste caso; include os documentos de esquema d são ignorados. |
redefine |
Proibido. A utilização de xs:redefine é proibida por DataContractSerializer motivos de segurança: x:redefine tem de schemaLocation ser seguida. Em determinadas circunstâncias, Svcutil.exe a utilização do DataContract restringe a utilização de schemaLocation . |
import |
Suportado. DataContractSerializer suporta xs:include e xs:import . No entanto, Svcutil.exe restringe o seguinte xs:include/@schemaLocation e xs:import/@location as referências quando os metadados são carregados a partir de um ficheiro local. A lista de ficheiros de esquema tem de ser transmitida através de um mecanismo fora de banda e não através include deste caso; include os documentos de esquema d são ignorados. |
simpleType |
Suportado. Veja a xs:simpleType secção . |
complexType |
Suportado, mapeia para contratos de dados. Veja a xs:complexType secção . |
group |
Ignorado. DataContractSerializer não suporta a utilização de xs:group , xs:attributeGroup e xs:attribute . Estas declarações são ignoradas como subordinadas de xs:schema , mas não podem ser referenciadas a partir de construções suportadas ou de outras complexType . |
attributeGroup |
Ignorado. DataContractSerializer não suporta a utilização de xs:group , xs:attributeGroup e xs:attribute . Estas declarações são ignoradas como subordinadas de xs:schema , mas não podem ser referenciadas a partir de construções suportadas ou de outras complexType . |
element |
Suportado. Veja Declaração de Elemento Global (GED). |
attribute |
Ignorado. DataContractSerializer não suporta a utilização de xs:group , xs:attributeGroup e xs:attribute . Estas declarações são ignoradas como subordinadas de xs:schema , mas não podem ser referenciadas a partir de construções suportadas ou de outras complexType . |
notation |
Ignorado. |
Tipos Complexos – <xs:complexType>
Informações Gerais
Cada tipo <complexo xs:complexType> mapeia para um contrato de dados.
<xs:complexType>: atributos
Atributo | Esquema |
---|---|
abstract |
Tem de ser falso (predefinição). |
block |
Proibido. |
final |
Ignorado. |
id |
Ignorado. |
mixed |
Tem de ser falso (predefinição). |
name |
Suportado e mapeado para o nome do contrato de dados. Se existirem períodos no nome, é feita uma tentativa de mapear o tipo para um tipo interno. Por exemplo, um tipo complexo denominado A.B mapas para um tipo de contrato de dados que é um tipo interno de um tipo com o nome A do contrato de dados , mas apenas se esse tipo de contrato de dados existir. É possível aninhar mais do que um ní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 |
As extensões são proibidas. A restrição só é permitida a partir de anySimpleType . |
complexContent |
Suportado. Veja "Herança". |
group |
Proibido. |
all |
Proibido. |
choice |
Proibido |
sequence |
Suportado, mapeia para os membros de dados de um contrato de dados. |
attribute |
Proibido, mesmo que utilize="proibido" (com uma exceção). Apenas são suportados atributos opcionais do espaço de nomes de Esquema de Serialização Padrão. Não mapeiam para os membros de dados no modelo de programação de contratos de dados. Atualmente, apenas um desses atributos tem significado e é discutido na secção ISerializable. Todos os outros são ignorados. |
attributeGroup |
Proibido. Na versão WCF v1, DataContractSerializer ignora a presença de dentro xs:complexType de attributeGroup . |
anyAttribute |
Proibido. |
(vazio) | Mapeia para um contrato de dados sem membros de dados. |
<xs:sequence> num tipo complexo: atributos
Atributo | Esquema |
---|---|
id |
Ignorado. |
maxOccurs |
Tem de ser 1 (predefinição). |
minOccurs |
Tem de ser 1 (predefinição). |
<xs:sequence> num tipo complexo: conteúdo
Conteúdos | Esquema |
---|---|
element |
Cada instância mapeia 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 coleção). Neste caso, omaxOccurs
atributo tem de 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 recolha. Neste caso, omaxOccurs
atributo tem de ser superior a 1 ou "não vinculado".Pode ocorrer numa
<xs:schema>
Declaração de Elemento Global (GED).
<xs:element> with maxOccurs=1 within an <xs:sequence> (Data Members)
Atributo | Esquema |
---|---|
ref |
Proibido. |
name |
Suportado, mapeia para o nome do membro de dados. |
type |
Suportado, mapeia para o tipo de membro de dados. Para obter mais informações, veja Mapeamento tipo/primitivo. Se não for especificado (e o elemento não contiver um tipo anónimo), xs:anyType é assumido. |
block |
Ignorado. |
default |
Proibido. |
fixed |
Proibido. |
form |
Tem de ser qualificado. Este atributo pode ser definido em elementFormDefault xs:schema . |
id |
Ignorado. |
maxOccurs |
1 |
minOccurs |
Mapeia para a IsRequired propriedade de um membro de dados (IsRequired é verdadeiro quando minOccurs é 1). |
nillable |
Afeta o mapeamento de tipos. Veja Mapeamento tipo/primitivo. |
<xs:element> with maxOccurs>1 within an <xs:sequence> (Collections)
Mapeia para um CollectionDataContractAttribute.
Nos tipos de coleção, apenas um elemento xs:é permitido numa 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 é no modelo de programação gerado. Existe um mecanismo de anotação de esquema que pode ser utilizado para indicar que um determinado tipo é uma coleção de dicionários.
As regras para os ref
atributos , block
, default
, fixed
, form
e id
são as mesmas que para o caso não coleção. Outros atributos incluem os da tabela seguinte.
Atributo | Esquema |
---|---|
name |
Suportado, mapeia para a ItemName propriedade no CollectionDataContractAttribute atributo. |
type |
Suportado, mapeia para o tipo armazenado na coleção. |
maxOccurs |
Maior que 1 ou "não vinculado". O esquema DC deve utilizar "não vinculado". |
minOccurs |
Ignorado. |
nillable |
Afeta o mapeamento de tipos. Este atributo é ignorado para coleções de dicionários. |
<xs:element> within an <xs:schema Global Element Declaration (Declaração de Elemento Global xs:schema> )
Uma Declaração de Elemento Global (GED) que tenha o mesmo nome e espaço de nomes que um tipo no esquema ou que defina um tipo anónimo dentro de si, diz-se que está associada ao tipo.
Exportação de esquema: os GEDs associados são gerados para cada tipo gerado, simples e complexo.
Deserialização/serialização: os GEDs associados são utilizados como elementos de raiz para o tipo.
Importação de esquema: os 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 |
Tem de ser falso para GEDs associados. |
block |
Proibido em GEDs associados. |
default |
Proibido em GEDs associados. |
final |
Tem de ser falso para GEDs associados. |
fixed |
Proibido em GEDs associados. |
id |
Ignorado. |
name |
Suportado. Veja a definição de GEDs associados. |
nillable |
Tem de ser verdadeiro para GEDs associados. |
substitutionGroup |
Proibido em GEDs associados. |
type |
Suportado e tem de corresponder ao tipo associado para GEDs associados (a menos que o elemento contenha um tipo anónimo). |
<xs:element>: contents
Conteúdos | Esquema |
---|---|
simpleType |
Suportado.* |
complexType |
Suportado.* |
unique |
Ignorado. |
key |
Ignorado. |
keyref |
Ignorado. |
(em branco) | Suportado. |
* Quando utilizar o e complexType,
mapeamento simpleType
para tipos anónimos é o mesmo que para tipos não anónimos, exceto que não existem contratos de dados anónimos, pelo que é criado um contrato de dados com nome, com um nome gerado derivado do nome do elemento. As regras para tipos anónimos estão na lista seguinte:
Detalhes de implementação do WCF: se o
xs:element
nome não contiver períodos, o tipo anónimo mapeia para um tipo interno do tipo de contrato de dados externo. Se o nome contiver períodos, o tipo de contrato de dados resultante é 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 de um período, o nome do elemento e a cadeia "Tipo".
Se já existir um contrato de dados com esse nome, o nome será tornado exclusivo ao acrescentar "1", "2", "3" e assim sucessivamente até que seja criado um nome exclusivo.
Tipos Simples - <xs:simpleType>
<xs:simpleType>: atributos
Atributo | Esquema |
---|---|
final |
Ignorado. |
id |
Ignorado. |
name |
Suportado, mapeia para o nome do contrato de dados. |
<xs:simpleType>: conteúdo
Conteúdos | Esquema |
---|---|
restriction |
Suportado. Mapeia para enumerar contratos de dados. Este atributo é ignorado se não corresponder ao padrão de enumeração. Veja a xs:simpleType secção restrições. |
list |
Suportado. Mapas para sinalizar contratos de dados de enumeração. Veja a xs:simpleType secção de listas. |
union |
Proibido. |
<xs:restriction>
As restrições de tipos complexos são suportadas apenas para base="
xs:anyType
".As restrições de tipo simples não
xs:string
têm quaisquer facetas de restrição quexs:enumeration
não sejam mapeadas para contratos de dados de enumeração.Todas as outras restrições de tipo simples são mapeadas para os tipos que restringem. Por exemplo, uma restrição de
xs:int
mapas a um número inteiro, tal comoxs:int
acontece. Para obter mais informações sobre o mapeamento de tipos primitivos, veja Mapeamento tipo/primitivo.
<xs:restriction>: atributos
Atributo | Esquema |
---|---|
base |
Tem de ser um tipo simples suportado ou xs:anyType . |
id |
Ignorado. |
<xs:restriction> para todos os outros casos: conteúdo
Conteúdos | Esquema |
---|---|
simpleType |
Se estiver presente, tem de 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:restriction> para enumerações: atributos
Atributo | Esquema |
---|---|
base |
Se estiver presente, tem de ser xs:string . |
id |
Ignorado. |
<xs:restriction> para enumerações: conteúdo
Conteúdos | Esquema |
---|---|
simpleType |
Se estiver presente, tem de ser uma restrição de enumeração suportada pelo contrato de dados (esta secçã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 o "valor" mapeia para o nome do valor no contrato de dados de enumeração. |
whiteSpace |
Proibido. |
pattern |
Proibido. |
(vazio) | Suportado, mapeia para o tipo de enumeração vazio. |
O código seguinte mostra uma classe de enumeração C#.
public enum MyEnum
{
first = 3,
second = 4,
third =5
}
Esta classe mapeia para o seguinte esquema pelo DataContractSerializer
. 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:list>
DataContractSerializer
mapeia tipos de enumeração marcados com System.FlagsAttribute
para xs:list
derivados de xs:string
. Não são suportadas outras xs:list
variações.
<xs:list>: atributos
Atributo | Esquema |
---|---|
itemType |
Proibido. |
id |
Ignorado. |
<xs:list>: conteúdo
Conteúdos | Esquema |
---|---|
simpleType |
Tem de ser uma restrição da utilização xs:enumeration da xs:string faceta. |
Se o valor de enumeração não seguir uma potência de 2 progressão (predefinição para Sinalizadores), o valor é armazenado no xs:annotation/xs:appInfo/ser:EnumerationValue
elemento.
Por exemplo, o seguinte código sinaliza um tipo de enumeração.
[Flags]
public enum AuthFlags
{
AuthAnonymous = 1,
AuthBasic = 2,
AuthNTLM = 4,
AuthMD5 = 16,
AuthWindowsLiveID = 64,
}
Este tipo mapeia para o seguinte esquema.
<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 mapeiam para uma base e são derivados por tipos de extensão com a <xs:extension>
construção de Esquema XML.
Um contrato de dados não pode herdar de um contrato de dados de recolha.
Por exemplo, o seguinte código é 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 mapeia 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 |
Tem de ser falso. |
<xs:complexContent>: conteúdo
Conteúdos | Esquema |
---|---|
restriction |
Proibido, exceto quando base="xs:anyType ". Este último é equivalente a colocar o conteúdo do xs:restriction diretamente no contentor do xs:complexContent . |
extension |
Suportado. Mapeia para herança de contratos de dados. |
<xs:extension> in <xs:complexContent>: attributes
Atributo | Esquema |
---|---|
id |
Ignorado. |
base |
Suportado. Mapeia para o tipo de contrato de dados base do qual este tipo herda. |
<xs:extension> in <xs:complexContent>: contents
As regras são as mesmas que para <xs:complexType>
os conteúdos.
Se for fornecido um <xs:sequence>
, os respetivos elementos membros são mapeados para membros de dados adicionais que estão presentes no contrato de dados derivado.
Se um tipo derivado contiver um elemento com o mesmo nome que um elemento num tipo de base, a declaração de elemento duplicado mapeia para um membro de dados com um nome que é gerado para ser exclusivo. Os números inteiros positivos são adicionados ao nome do membro de dados ("member1", "member2", etc.) até ser encontrado um nome exclusivo. Por outro lado:
Se um contrato de dados derivado tiver um membro de dados com o mesmo nome e tipo que um membro de dados num contrato de dados base,
DataContractSerializer
gera este 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 num contrato de dados base, mas com um tipo diferente, o
DataContractSerializer
importa um esquema com um elemento do tipo no tipoxs:anyType
base e declarações de 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 tipo/primitivo
O DataContractSerializer
utiliza o seguinte mapeamento para tipos primitivos de Esquema XML.
Tipo XSD | Tipo de .NET |
---|---|
anyType |
Object. |
anySimpleType |
String. |
duration |
TimeSpan. |
dateTime |
DateTime. |
dateTimeOffset |
DateTime e TimeSpan para o desvio. Veja DateTimeOffset Serialization 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 ISerializáveis
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. Existem muitos tipos de .NET Framework que implementam ISerializable
e que podem ser transmitidos entre aplicações. DataContractSerializer fornece naturalmente suporte para ISerializable
turmas. 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
espaço de nomes.
<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 Contratos de Dados referencia uma classe de fábrica que pode anular a serialização do tipo. A classe de fábrica tem de fazer parte da coleção de tipos conhecidos da instância que está a DataContractSerializer
ser utilizada. Para obter mais informações sobre tipos conhecidos, veja Tipos Conhecidos do Contrato de Dados.
Esquema de Serialização dataContract
Vários esquemas exportados pelos DataContractSerializer
tipos de utilização, elementos e atributos de um espaço de nomes especial de Serialização de Contratos de Dados:
http://schemas.microsoft.com/2003/10/Serialization
Segue-se uma declaração de esquema de Serialização de Contratos de Dados completa.
<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 ser indicado o seguinte:
ser:char
é introduzido para representar carateres Unicode do tipo Char.O
valuespace
dexs:duration
é reduzido para um conjunto ordenado para que possa ser mapeado para um TimeSpan.FactoryType
é utilizado em esquemas exportados de tipos derivados de ISerializable.
Importar esquemas não DataContract
DataContractSerializer
tem a opção ImportXmlTypes
de permitir a importação de esquemas que não estão em conformidade com o DataContractSerializer
perfil XSD (ver a Options propriedade). Definir esta opção para permitir a true
aceitação de tipos de esquema não conformes e mapeá-los para a implementação seguinte, IXmlSerializable encapsulando uma matriz de XmlNode (apenas o nome da 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, é serializado como um elemento complexo com duas partes. A primeira parte representa a data/hora e a segunda parte representa o desvio da data/hora. No código seguinte, é apresentado um exemplo de um valor DateTimeOffset serializado.
<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>