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'attributminOccurs
est uniquement affecté par le paramètre IsRequired, et l'attributnillable
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.