Referências de objetos interoperáveis

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 IsReference garante a conformidade na troca 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 referencial quando ida e volta.

Consulte também