Freigeben über


Interoperable Objektverweise

Standardmäßig serialisiert der DataContractSerializer Objekte anhand des Werts. Mithilfe der IsReference-Eigenschaft können Sie den Datenvertragsserialisierer anweisen, die Objektverweise beim Serialisieren von Objekten des Typs beizubehalten.

Generierte XML

Betrachten Sie als Beispiel das folgende Objekt:

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

public class SomeClass 
{
}

Ist PreserveObjectReferences auf false festgelegt (Standardeinstellung), wird die folgende XML generiert:

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

Ist PreserveObjectReferences auf true festgelegt, wird die folgende XML generiert:

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

XsdDataContractExporter beschreibt jedoch nicht das id- und das ref-Attribut im Schema. Dies ist auch dann der Fall, wenn die preserveObjectReferences-Eigenschaft auf true festgelegt ist.

Verwenden von IsReference

Wenden Sie zum Generieren von Objektverweisinformationen, die gemäß dem beschreibenden Schema gültig sind, das DataContractAttribute-Attribut auf einen Typ an, und legen Sie das IsReference-Flag auf true fest. Verwendung von IsReference in der vorherigen X-Beispielklasse:

public class X

{

SomeClass someInstance = new SomeClass();

[DataMember(IsReference=true)]

public SomeClass A = someInstance;

[DataMember(IsReference=true)]

public SomeClass B = someInstance;

}

public class SomeClass

{

}

Folgende XML wird generiert:

<X>

<A id="1">

<Value>contents of A</Value>

</A>

<B ref="1">

</B>

</X>

Durch die Verwendung von IsReference wird die Kompatibilität für Nachrichten-Roundtrips gewährleistet. Wird dieses Element nicht verwendet, wird beim Erstellen eines Typs aus dem Schema nicht unbedingt eine XML für diesen Typ zurückgesendet, die mit dem ursprünglich angenommenen Schema kompatibel ist. Mit anderen Worten: Obgleich das id- und das ref-Attribut serialisiert wurden, wurde durch das ursprüngliche Schema möglicherweise verhindert, dass diese Attribute (oder alle Attribute) in der XML erscheinen. Wurde IsReference auf einen Datenmember angewendet, gilt der Member bei Roundtrips auch weiterhin als "verweisbar".

Siehe auch

Verweis

DataContractAttribute
CollectionDataContractAttribute
IsReference
IsReference