Referenser till samverkande objekt
Som standard DataContractSerializer serialiserar objekt efter värde. Du kan använda IsReference egenskapen för att instruera datakontraktsserialiseraren att bevara objektreferenser vid serialisering av objekt.
Genererad XML
Tänk till exempel på följande objekt:
[DataContract]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
public SomeClass B = someInstance;
}
public class SomeClass
{
}
Med PreserveObjectReferences inställt på false
(standard) genereras följande XML:
<X>
<A>contents of someInstance</A>
<B>contents of someInstance</B>
</X>
Med PreserveObjectReferences inställt på true
genereras följande XML:
<X>
<A id="1">contents of someInstance</A>
<B ref="1"></B>
</X>
Beskriver dock XsdDataContractExporter inte attributen id
och ref
i schemat, inte ens när preserveObjectReferences
egenskapen är inställd på true
.
Använda IsReference
Om du vill generera objektreferensinformation som är giltig enligt schemat som beskriver den använder du DataContractAttribute attributet för en typ och anger IsReference flaggan till true
. I följande exempel ändras klassen X
i föregående exempel genom att lägga till IsReference
:
[DataContract(IsReference=true)]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
public SomeClass B = someInstance;
}
public class SomeClass
{
}
Den genererade XML:en är följande:
<X>
<A id="1">
<Value>contents of A</Value>
</A>
<B ref="1"></B>
</X>
Att använda IsReference
säkerställer kompatibilitet vid avkörning av meddelanden. Utan den är XML-utdata för den typen inte nödvändigtvis kompatibla med det schema som ursprungligen antogs när en typ genereras från schemat. Med andra ord, även om attributen id
och ref
serialiserades, kan det ursprungliga schemat ha hindrat dessa attribut (eller alla attribut) från att förekomma i XML-koden. När IsReference
den tillämpas på en datamedlem fortsätter medlemmen att identifieras som referensbar när den avrundas.