Freigeben über


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.

Siehe auch