Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de changer d’annuaire.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer d’annuaire.
Dans .NET Framework, les types ont un concept de valeurs par défaut. Par exemple, pour tout type de référence, la valeur par défaut est null, et pour un type entier, il est égal à zéro. Il est parfois souhaitable d’omettre un membre de données à partir de données sérialisées lorsqu’il est défini sur sa valeur par défaut. Étant donné que le membre a une valeur par défaut, une valeur réelle n’a pas besoin d’être sérialisée ; cela présente un avantage en matière de performances.
Pour omettre un membre des données sérialisées, définissez la EmitDefaultValue propriété de l’attribut DataMemberAttributefalse sur (la valeur par défaut est true).
Remarque
Vous devez définir la propriété EmitDefaultValue à false, s’il existe un besoin spécifique de la faire, par exemple pour l’interopérabilité ou la réduction de 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 nulle 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és. Enfin, targetSalary est sérialisé comme d’habitude, même si la propriété EmitDefaultValue est définie sur false, car 57800 ne correspond pas à la valeur par défaut .NET 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 à ce qui suit.
<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 d’instance de schéma XML W3C (World Wide Web Consortium) qui fournit un moyen interopérable de 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. Le récepteur peut interpréter ces valeurs comme null, zéro et null, respectivement. Il n’existe aucune garantie qu’un désérialiseur tiers peut rendre l’interprétation correcte, c’est pourquoi ce modèle n’est pas recommandé. La DataContractSerializer classe sélectionne toujours l’interprétation correcte pour les valeurs manquantes.
Interaction avec IsRequired
Comme indiqué dans Data Contract Versioning, l’attribut DataMemberAttribute a une IsRequired propriété (la valeur par défaut est false). La propriété indique si un membre de données donné doit être présent dans les données sérialisées lorsqu’il est désérialisé. Si IsRequired est défini sur true (ce qui indique qu'une valeur doit être présente) et EmitDefaultValue est défini sur false (indiquant que la valeur ne doit pas être présente si elle est définie sur sa valeur par défaut), les valeurs par défaut pour ce membre de données ne peuvent pas être sérialisées, car les résultats seraient contradictoires. Si un tel membre de données est défini sur sa valeur par défaut (généralement null ou zéro) et qu'une sérialisation est tentée, une SerializationException est lancée.
Représentation de schéma
Les détails de la représentation du schéma de définition XML (XSD) des éléments de données lorsque la propriété EmitDefaultValue est défini par false sont abordé dans Référence de schéma de contrat de données. Toutefois, voici une brève vue d’ensemble :
Lorsque la EmitDefaultValue est définie sur
false, elle est représentée dans le schéma en tant qu'annotation spécifique à Windows Communication Foundation (WCF). Il n’existe aucun moyen interopérable de représenter ces informations. En particulier, l’attribut « default » dans le schéma n’est pas utilisé à cet effet, l’attributminOccursest affecté uniquement par le IsRequired paramètre et l’attributnillableest affecté uniquement 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. Il incombe au point de terminaison de réception d’interpréter correctement un élément manquant.
Lors de l’importation de schéma, la EmitDefaultValue propriété est automatiquement définie false chaque fois que l’annotation spécifique à WCF mentionnée précédemment 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.