Compartir vía


Referencias de objeto interoperables

De forma predeterminada, DataContractSerializer serializa los objetos por valor. Puede usar la IsReference propiedad para indicar al serializador de contrato de datos que conserve las referencias de objeto al serializar objetos.

XML generado

Por ejemplo, considere el siguiente objeto:

[DataContract]  
public class X  
{  
    SomeClass someInstance = new SomeClass();  
    [DataMember]  
    public SomeClass A = someInstance;  
    [DataMember]  
    public SomeClass B = someInstance;  
}  
  
public class SomeClass
{  
}  

Con PreserveObjectReferences establecido en false (valor predeterminado), se genera el siguiente XML:

<X>  
   <A>contents of someInstance</A>  
   <B>contents of someInstance</B>  
</X>  

Con PreserveObjectReferences establecido en true, se genera el siguiente XML:

<X>  
   <A id="1">contents of someInstance</A>  
   <B ref="1"></B>  
</X>  

Sin embargo, XsdDataContractExporter no describe los id y ref atributos en su esquema, incluso cuando la propiedad preserveObjectReferences está establecida en true.

Uso de IsReference

Para generar información de referencia de objeto válida según el esquema que la describe, aplique el atributo DataContractAttribute a un tipo y establezca el indicador IsReference en true. En el ejemplo siguiente se modifica la clase X del ejemplo anterior agregando IsReference:

[DataContract(IsReference=true)]
public class X
{  
     SomeClass someInstance = new SomeClass();
     [DataMember]
     public SomeClass A = someInstance;
     [DataMember]
     public SomeClass B = someInstance;
}
  
public class SomeClass
{
}  

El XML generado es el siguiente:

<X>  
    <A id="1">
        <Value>contents of A</Value>  
    </A>
    <B ref="1"></B>  
</X>

El uso de IsReference garantiza la compatibilidad en los viajes de ida y vuelta (round trip) de los mensajes. Sin él, cuando se genera un tipo a partir del esquema, la salida XML de ese tipo no es necesariamente compatible con el esquema asumido originalmente. En otras palabras, aunque los id atributos y ref se serializaron, el esquema original podría haber prohibido que se produzcan estos atributos (o todos los atributos) en el XML. Cuando se aplica IsReference a un miembro de datos, se sigue reconociendo al miembro como referenciable en los viajes de ida y vuelta (round trip).

Consulte también