Interoperable Objektverweise
Standardmäßig serialisiert der DataContractSerializer Objekte anhand des Werts. Mit der IsReference-Eigenschaft können Sie den Datenvertragsserialisierer anweisen, Objektreferenzen bei der Serialisierung von Objekten zu erhalten.
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"></B>
</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. Im folgenden Beispiel wird die Klasse X
im vorherigen Beispiel geändert, indem hinzugefügt wird IsReference
:
[DataContract(IsReference=true)]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
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. Wenn ein Typ aus einem Schema generiert wird, ist die XML-Ausgabe dieses Typs sonst nicht unbedingt mit dem ursprünglich angenommenen Schema kompatibel. 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. Wenn IsReference
auf ein Datenelement angewendet wird, wird das Element weiterhin als referenzierbar erkannt, wenn ein Roundtrip stattfindet.