Partager via


Références d’objets interopérables

Par défaut, DataContractSerializer sérialise les objets par valeur. Vous pouvez utiliser la IsReference propriété pour indiquer au sérialiseur de contrat de données de conserver les références d’objets lors de la sérialisation d’objets.

XML généré

Par exemple, considérez l’objet suivant :

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

Avec PreserveObjectReferences réglé sur false (valeur par défaut), le code XML suivant est généré :

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

Avec PreserveObjectReferences réglé sur true, le code XML suivant est généré :

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

Toutefois, XsdDataContractExporter ne décrit pas les attributs id et ref dans son schéma, même lorsque la propriété preserveObjectReferences est définie sur true.

Utilisation de IsReference

Pour générer des informations de référence d’objet valides en fonction du schéma qui le décrit, appliquez l’attribut DataContractAttribute à un type et définissez l’indicateur IsReference sur true. L’exemple suivant modifie la classe X dans l’exemple précédent en ajoutant IsReference:

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

Le code XML généré est le suivant :

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

L’utilisation IsReference garantit la conformité lors de l’aller-retour des messages. Sans cela, lorsqu’un type est généré à partir du schéma, la sortie XML de ce type n’est pas nécessairement compatible avec le schéma initialement supposé. En d’autres termes, bien que les attributs id et ref aient été sérialisés, le schéma d’origine aurait pu empêcher ces attributs (ou tous les attributs) de figurer dans le XML. Lorsque IsReference est appliqué à un membre de données, ce dernier continue d’être reconnu comme référençable lorsqu’il fait l’aller-retour.

Voir aussi