Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Por padrão, DataContractSerializer serializa objetos por valor. Você pode usar a IsReference propriedade para instruir o serializador de contrato de dados a preservar referências de objeto ao serializar objetos.
XML gerado
Como exemplo, considere o seguinte objeto:
[DataContract]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
public SomeClass B = someInstance;
}
public class SomeClass
{
}
Com PreserveObjectReferences definido como false (o padrão), o seguinte XML é gerado:
<X>
<A>contents of someInstance</A>
<B>contents of someInstance</B>
</X>
Com PreserveObjectReferences definido como true, o seguinte XML é gerado:
<X>
<A id="1">contents of someInstance</A>
<B ref="1"></B>
</X>
No entanto, XsdDataContractExporter não descreve os id atributos e ref em seu esquema, mesmo quando a preserveObjectReferences propriedade está definida como true.
Usando IsReference
Para gerar informações de referência de objeto válidas de acordo com o esquema que as descreve, aplique o DataContractAttribute atributo a um tipo e defina o IsReference sinalizador como true. O exemplo a seguir modifica a classe X no exemplo anterior adicionando IsReference:
[DataContract(IsReference=true)]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
public SomeClass B = someInstance;
}
public class SomeClass
{
}
O XML gerado é o seguinte:
<X>
<A id="1">
<Value>contents of A</Value>
</A>
<B ref="1"></B>
</X>
O uso de IsReference garante a conformidade na ida e volta de mensagens. Sem ele, quando um tipo é gerado a partir do esquema, a saída XML para esse tipo não é necessariamente compatível com o esquema originalmente assumido. Em outras palavras, embora os id atributos e ref tenham sido serializados, o esquema original poderia ter impedido que esses atributos (ou todos os atributos) ocorressem no XML. Com IsReference aplicado a um membro de dados, o membro continua a ser reconhecido como referenciável durante o processo de ida e volta dos dados.