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 AttributminOccurs
wird nur durch die Einstellung IsRequired beeinflusst und das Attributnillable
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.