Referências de objeto interoperável
Por padrão, DataContractSerializer serializa os objetos por valor. Use a propriedade IsReference para instruir o serializador de contrato de dados a preservar as referências de objeto ao serializar objetos.
XML gerado
Por 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 atributos id
e ref
no esquema, mesmo quando a propriedade preserveObjectReferences
está definida como true
.
Como usar IsReference
Para gerar informações de referência de objeto que são válidas de acordo com o esquema que o descreve, aplique o atributo DataContractAttribute a um tipo e defina o sinalizador IsReference como true
. O seguinte exemplo 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 com a ida e volta das mensagens. Sem ele, quando um tipo é gerado com base no esquema, a saída XML para esse tipo não é necessariamente compatível com o esquema originalmente presumido. Em outras palavras, embora os atributos id
e ref
tenham sido serializados, o esquema original poderia ter impedido esses atributos (ou todos os atributos) de ocorrerem no XML. Com IsReference
aplicado a um membro de dados, o membro continua sendo reconhecido como passível de referência durante a ida e volta.