Freigeben über


Interoperable Objektverweise

Standardmäßig serialisiert DataContractSerializer Objekte nach Wert. Mit der IsReference Eigenschaft können Sie den Serialisierer für den Datenvertrag anweisen, Objektverweise beim Serialisieren von Objekten beizubehalten.

Generiertes XML

Betrachten Sie beispielsweise das folgende Objekt:

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

Bei PreserveObjectReferences Festlegung auf false (Standardeinstellung) wird der folgende XML-Code generiert:

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

Wenn PreserveObjectReferences auf true gesetzt ist, wird der folgende XML-Code generiert:

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

XsdDataContractExporter beschreibt jedoch nicht die id und ref Attribute in ihrem Schema, auch wenn die preserveObjectReferences eigenschaft auf true gesetzt ist.

Verwenden von IsReference

Um Objektverweisinformationen zu generieren, die gemäß dem Schema gültig sind, das sie beschreibt, wenden Sie das DataContractAttribute Attribut auf einen Typ an, und legen Sie das IsReference Flag auf true. Im folgenden Beispiel wird die Klasse X im vorherigen Beispiel durch das Hinzufügen von IsReference verändert.

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

Der generierte XML-Code lautet wie folgt:

<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. Ohne diese Bedingung ist die XML-Ausgabe für einen aus dem Schema generierten Typ nicht unbedingt mit dem ursprünglich angenommenen Schema kompatibel. Anders ausgedrückt: Obwohl die id- und ref-Attribute serialisiert wurden, hätte das ursprüngliche Schema diese Attribute (oder alle Attribute) im XML ausschließen können. Wenn IsReference auf ein Datenelement angewendet wird, wird das Element weiterhin als referenzierbar erkannt, wenn ein Roundtrip stattfindet.

Siehe auch