Compartir a través de


Referencias a objetos interoperables

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

XML generado

A modo de ejemplo, considere el objeto siguiente:

[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 código XML siguiente:

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

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

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

Sin embargo, XsdDataContractExporter no describe los atributos ref e id en su esquema, incluso cuando la propiedad preserveObjectReferences se establece en true.

Uso de IsReference

Para generar información de referencia a objetos válida según el esquema que la describe, aplique el atributo DataContractAttribute a un tipo y establezca la marca IsReference en true. Uso de IsReference en la clase X del ejemplo anterior:

public class X

{

SomeClass someInstance = new SomeClass();

[DataMember(IsReference=true)]

public SomeClass A = someInstance;

[DataMember(IsReference=true)]

public SomeClass B = someInstance;

}

public class SomeClass

{

}

El código 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. Si no está presente, cuando se genera un tipo desde el esquema, lo que se devuelve como XML para ese tipo no es necesariamente compatible con el esquema supuesto inicialmente. En otras palabras, aunque se serializasen los atributos ref e id, el esquema original podría haber excluido estos atributos (o todos los atributos) en el código XML. Cuando se aplica IsReference a un miembro de datos, el miembro continúa siendo reconocido como "referenciable" en los viajes de ida y vuelta (round trip).

Vea también

Referencia

DataContractAttribute
CollectionDataContractAttribute
IsReference
IsReference