Dela via


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å truegenereras 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.

Se även