Valeurs par défaut des membres de données

Dans le .NET Framework, les types possèdent un concept de valeurs par défaut. Ainsi, la valeur par défaut d'un type référence est null, et celle d'un type entier est zéro. Il est parfois préférable d'omettre un membre de données des données sérialisées lorsqu'il est défini à sa valeur par défaut. Le membre ayant une valeur par défaut, il n'est pas nécessaire de sérialiser une valeur réelle ; cela présente un avantage en termes de performance.

Pour omettre un membre des données sérialisées, affectez EmitDefaultValue à la propriété DataMemberAttribute de l'attribut false (la valeur par défaut est true).

Notes

Vous devez uniquement affecter la valeur EmitDefaultValue à la propriété false en cas de besoin spécifique, par exemple à des fins d'interopérabilité ou pour réduire la taille des données.

Exemple

Le code suivant a plusieurs membres avec EmitDefaultValue défini à false.

[DataContract]
public class Employee
{
    [DataMember]
    public string employeeName = null;
    [DataMember]
    public int employeeID = 0;
    [DataMember(EmitDefaultValue = false)]
    public string position = null;
    [DataMember(EmitDefaultValue = false)]
    public int salary = 0;
    [DataMember(EmitDefaultValue = false)]
    public int? bonus = null;
    [DataMember(EmitDefaultValue = false)]
    public int targetSalary = 57800;
}
<DataContract()> _
Public Class Employee
    <DataMember()> _
    Public employeeName As String = Nothing
    <DataMember()> _
    Public employeeID As Integer = 0
    <DataMember(EmitDefaultValue:=False)> _
    Public position As String = Nothing
    <DataMember(EmitDefaultValue:=False)> _
    Public salary As Integer = 0
    <DataMember(EmitDefaultValue:=False)> _
    Public Bonus As Integer = Bonus OrElse Nothing
    <DataMember(EmitDefaultValue:=False)> _
    Public targetSalary As Integer = 57800
End Class

Si une instance de cette classe est sérialisée, le résultat est le suivant : employeeName et employeeID sont sérialisés. La valeur null pour employeeName et la valeur zéro pour employeeID font explicitement partie des données sérialisées. Toutefois, les membres position, salary et bonus ne sont pas sérialisées. Enfin, targetSalary est sérialisé comme d'habitude, même si la propriété EmitDefaultValue a la valeur false, car 57800 ne correspond pas à la valeur .NET par défaut pour un entier, qui est zéro.

Représentation XML

Si l'exemple précédent est sérialisé en XML, la représentation est similaire à la suivante.

<Employee>  
   <employeeName xsi:nil="true" />  
   <employeeID>0</employeeID>  
<targetSalary>57800</targetSalary>  
</Employee>  

L’attribut xsi:nil est un attribut spécial dans l’espace de noms de l’instance WC3 (World Wide Web Consortium ) XML Schema qui offre un moyen interopérable pour représenter explicitement une valeur null. Notez que le XML ne contient aucune information sur le poste, le salaire et les primes des membres de données. L'extrémité de réception peut les interpréter comme null, zéro et null, respectivement. Il n'y a aucune garantie qu'un désérialiseur tiers puisse effectuer correctement l'interprétation ; c'est pourquoi ce modèle n'est pas recommandé. La classe DataContractSerializer sélectionne systématiquement l'interprétation correcte pour les valeurs manquantes.

Interaction avec IsRequired

Comme indiqué dans Contrôle de version des contrats de données, l’attribut DataMemberAttribute a une propriété IsRequired (sa valeur par défaut est false). La propriété indique si un membre de données spécifique doit ou non être présent dans les données sérialisées lorsqu'il est désérialisé. Si IsRequired a la valeur true (ce qui indique qu'une valeur doit être présente) et que EmitDefaultValue a la valeur false (ce qui indique que la valeur ne doit pas être présente si la valeur indiquée est celle par défaut), les valeurs par défaut de ce membre de données ne peuvent pas être sérialisées car les résultats seraient contradictoires. Si un membre de données de ce type à pour valeur sa valeur par défaut (généralement null ou zéro) et qu'une sérialisation est tentée, une exception SerializationException est levée.

Représentation de schéma

Les détails de la représentation de schéma XSD (XML Schema Definition Language) des membres de données lorsque la propriété EmitDefaultValue a la valeur false sont présentés dans la Référence du schéma de contrat de données. Toutefois, en voici une brève vue d'ensemble :

  • Lorsque EmitDefaultValue est défini sur false, il est représenté dans le schéma en tant qu’annotation spécifique à Windows Communication Foundation (WCF). Il n'existe pas de moyen interopérable pour représenter ces informations. En particulier, l'attribut "default" dans le schéma n'est pas utilisé à cette fin, l'attribut minOccurs est uniquement affecté par le paramètre IsRequired, et l'attribut nillable est uniquement affecté par le type du membre de données.

  • La valeur par défaut réelle à utiliser n'est pas présente dans le schéma. C'est au point de terminaison de réception d'interpréter correctement un élément manquant.

Sur l’importation de schéma, la propriété EmitDefaultValue a automatiquement la valeur false chaque fois que l’annotation spécifique à WCF précédemment mentionnée est détectée. Elle a également la valeur false pour les types référence dont la propriété nillable a la valeur false afin de prendre en charge des scénarios d’interopérabilité spécifiques qui se produisent généralement lors de la consommation des services Web ASP.NET.

Voir aussi