Standardwerte der Datenelemente

Im .NET Framework verfügen Typen über ein Konzept von Standardwerten. Für jeden Referenztyp ist der Standardwert beispielsweise null, und für einen Integertyp ist er 0 (null). Von Zeit zu Zeit ist es empfehlenswert, ein Datenelement aus serialisierten Daten zu entfernen, wenn es auf seinen Standardwert festgelegt ist. Da das Element seinen Standardwert besitzt, braucht kein tatsächlicher Wert serialisiert werden; dies führt zu einem Leistungsvorteil.

Um ein Element aus den serialisierten Daten zu löschen, legen Sie die Eigenschaft EmitDefaultValue des Attributs DataMemberAttribute auf false fest (der Standardwert ist true).

Hinweis

Sie sollten die EmitDefaultValue-Eigenschaft bei Bedarf auf false festlegen, z. B. aus Interoperabilitätsgründen oder zum Verringern der Datengröße.

Beispiel

Der folgende Code verfügt über mehrere Elemente, deren EmitDefaultValue auf false festgelegt ist.

[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

Wenn eine Instanz dieser Klasse serialisiert wird, ergibt sich folgendes Ergebnis: employeeName und employeeID sind serialisiert. Der Nullwert für employeeName und der Nullwert für employeeID sind ausdrücklich Teil der serialisierten Daten. Die Elemente position, salary und bonus sind hingegen nicht serialisiert. targetSalary wird wie gewöhnlich serialisiert, auch wenn die EmitDefaultValue-Eigenschaft auf false festgelegt ist, da "57800" nicht mit dem .NET-Standardwert einer ganzen Zahl ("0") übereinstimmt.

XML-Darstellung

Wenn das vorherige Beispiel nach XML serialisiert wird, ähnelt die Darstellung Folgendem:

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

Das Attribut xsi:nil ist ein Spezialattribut im XML-Schemainstanz-Namespace des World Wide Web Consortium (W3C), der eine interoperable Möglichkeit bietet, speziell einen Nullwert darzustellen. Bitte beachten Sie, dass es im XML keinerlei Informationen über die Datenelemente Position, Gehalt und Bonus gibt. Die Emfangsseite kann diese als null, Null bzw. null interpretieren. Es gibt keine Garantie, dass einem Fremdanbieterdeserialisierer eine korrekte Auslegung gelingt; daher wird dieses Muster nicht empfohlen. Die Klasse DataContractSerializer wählt immer die richtige Auslegung für fehlende Werte.

Interaktion mit IsRequired

Wie in erläutert, verfügt DataMemberAttributedas Attribut Datenvertragsversionsverwaltung über eine Eigenschaft IsRequired (der Standard ist false). Die Eigenschaft gibt an, ob ein bestimmtes Datenelement in den serialisierten Daten vorliegen muss, wenn sie deserialisiert werden. Wenn IsRequired auf true (gibt an, dass ein Wert vorliegen muss) und EmitDefaultValue auf false festgelegt ist (gibt an, dass der Wert nicht vorliegen muss, wenn das Element auf den Standardwert festgelegt ist), können Standardwerte für dieses Datenelement nicht serialisiert werden, da die Ergebnisse widersprüchlich wären. Wenn ein derartiges Datenelement auf seinen Standardwert gesetzt ist (normalerweise null oder 0 (null)) und eine Serialisierung versucht wird, wird eine SerializationException ausgelöst.

Schemendarstellung

Die Details der Schemadarstellung von Datenelementen der XML Schema-Definitionssprache (XSD) bei Festlegung der Eigenschaft EmitDefaultValue auf false werden in Datenvertragsschemareferenz untersucht. Im Folgenden wird jedoch nur eine kurze Übersicht gegeben:

  • Wenn das EmitDefaultValue auf false gesetzt ist, wird es im Schema als eine für Windows Communication Foundation (WCF) spezifische Anmerkung dargestellt. Es gibt keine interoperable Möglichkeit, diese Informationen darzustellen. Besonders das Attribut "default" wird in diesem Schema nicht für diesen Zweck verwendet; das Attribut minOccurs wird nur durch die Einstellung IsRequired beeinflusst und das Attribut nillable wird nur von dem Typ des Datenelements beeinflusst.

  • Den zu verwendenden tatsächlichen Standardwert gibt es in dem Schema nicht. Der empfangende Endpunkt ist dafür verantwortlich, ein fehlendes Element angemessen zu interpretieren.

Beim Schemenimport wird die Eigenschaft EmitDefaultValue automatisch immer dann auf false festgelegt, wenn die zuvor erwähnte, spezifische Anmerkung gefunden wird. Außerdem wird sie für Referenztypen auf false festgelegt, deren Eigenschaft nillable auf false festgelegt ist, um spezielle Interoperabilitätsszenarien zu unterstützen, die häufig bei der Nutzung von ASP.NET-Webdiensten auftreten.

Siehe auch