Compartilhar via


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.

Confira também