Standardwerte der DatenelementeData Member Default Values

In der .NET Framework.NET Framework, besitzen Typen ein Konzept von Standardwerte.In the .NET Framework.NET Framework, types have a concept of default values. Für jeden Referenztyp ist der Standardwert beispielsweise null, und für einen Integertyp ist er 0 (null).For example, for any reference type the default value is null, and for an integer type it is zero. Von Zeit zu Zeit ist es empfehlenswert, ein Datenelement aus serialisierten Daten zu entfernen, wenn es auf seinen Standardwert festgelegt ist.It is occasionally desirable to omit a data member from serialized data when it is set to its default value. Da das Element seinen Standardwert besitzt, braucht kein tatsächlicher Wert serialisiert werden; dies führt zu einem Leistungsvorteil.Because the member has a default value, an actual value need not be serialized; this has a performance advantage.

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).To omit a member from serialized data, set the EmitDefaultValue property of the DataMemberAttribute attribute to false (the default is true).

Hinweis

Sie sollten die EmitDefaultValue-Eigenschaft bei Bedarf auf false festlegen, z. B. aus Interoperabilitätsgründen oder zum Verringern der Datengröße.You should set the EmitDefaultValue property to false if there is a specific need to do so, such as for interoperability or data size reduction.

BeispielExample

Der folgende Code verfügt über mehrere Elemente, deren EmitDefaultValue auf false festgelegt ist.The following code has several members with the EmitDefaultValue set to 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 

Wenn eine Instanz dieser Klasse serialisiert wird, ergibt sich folgendes Ergebnis: employeeName und employeeID sind serialisiert.If an instance of this class is serialized, the result is as follows: employeeName and employeeID is serialized. Der Nullwert für employeeName und der Nullwert für employeeID sind ausdrücklich Teil der serialisierten Daten.The null value for employeeName and the zero value for employeeID is explicitly part of the serialized data. Die Elemente position, salary und bonus sind hingegen nicht serialisiert.However, the position, salary, and bonus members are not serialized. 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.Finally, targetSalary is serialized as usual, even though the EmitDefaultValue property is set to false, because 57800 does not match the .NET default value for an integer, which is zero.

XML-DarstellungXML Representation

Wenn das vorherige Beispiel nach XML serialisiert wird, ähnelt die Darstellung Folgendem:If the previous example is serialized to XML, the representation is similar to the following.

<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.The xsi:nil attribute is a special attribute in the World Wide Web Consortium (W3C) XML Schema instance namespace that provides an interoperable way to explicitly represent a null value. Bitte beachten Sie, dass es im XML keinerlei Informationen über die Datenelemente Position, Gehalt und Bonus gibt.Note that there is no information at all in the XML about position, salary, and bonus data members. Die Emfangsseite kann diese als null, Null bzw. null interpretieren.The receiving end can interpret these as null, zero, and null, respectively. Es gibt keine Garantie, dass einem Fremdanbieterdeserialisierer eine korrekte Auslegung gelingt; daher wird dieses Muster nicht empfohlen.There is no guarantee that a third-party deserializer can make the correct interpretation, which is why this pattern is not recommended. Die Klasse DataContractSerializer wählt immer die richtige Auslegung für fehlende Werte.The DataContractSerializer class always selects the correct interpretation for missing values.

Interaktion mit IsRequiredInteraction with IsRequired

Entsprechend der Anleitung unter Datenvertragsversionsverwaltung, DataMemberAttribute Attribut hat eine IsRequired Eigenschaft (die Standardeinstellung ist false).As discussed in Data Contract Versioning, the DataMemberAttribute attribute has an IsRequired property (the default is false). Die Eigenschaft gibt an, ob ein bestimmtes Datenelement in den serialisierten Daten vorliegen muss, wenn sie deserialisiert werden.The property indicates whether a given data member must be present in the serialized data when it is being deserialized. 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.If IsRequired is set to true, (which indicates that a value must be present) and EmitDefaultValue is set to false (indicating that the value must not be present if it is set to its default value), default values for this data member cannot be serialized because the results would be contradictory. Wenn ein derartiges Datenelement auf seinen Standardwert gesetzt ist (normalerweise null oder 0 (null)) und eine Serialisierung versucht wird, wird eine SerializationException ausgelöst.If such a data member is set to its default value (usually null or zero) and a serialization is attempted, a SerializationException is thrown.

SchemendarstellungSchema Representation

Die Details der XML Schema Definition Language (XSD) schemendarstellung des Datenmember bei der EmitDefaultValue -Eigenschaftensatz auf false finden Sie im Abschnitt Datenvertrags-Schemareferenz.The details of the XML Schema definition language (XSD) schema representation of data members when the EmitDefaultValue property is set to false are discussed in Data Contract Schema Reference. Im Folgenden wird jedoch nur eine kurze Übersicht gegeben:However, the following is a brief overview:

  • Wenn EmitDefaultValue auf false festgelegt ist, wird es im Schema als eine Anmerkung, die spezifisch für Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) ist, dargestellt.When the EmitDefaultValue is set to false, it is represented in the schema as an annotation specific to Windows Communication Foundation (WCF)Windows Communication Foundation (WCF). Es gibt keine interoperable Möglichkeit, diese Informationen darzustellen.There is no interoperable way to represent this information. 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.In particular, the "default" attribute in the schema is not used for this purpose, the minOccurs attribute is affected only by the IsRequired setting, and the nillable attribute is affected only by the type of the data member.

  • Den zu verwendenden tatsächlichen Standardwert gibt es in dem Schema nicht.The actual default value to use is not present in the schema. Der empfangende Endpunkt ist dafür verantwortlich, ein fehlendes Element angemessen zu interpretieren.It is up to the receiving endpoint to appropriately interpret a missing element.

Beim Schemenimport wird die Eigenschaft EmitDefaultValue automatisch immer dann auf false festgelegt, wenn die zuvor erwähnte, WCFWCF-spezifische Anmerkung gefunden wird.On schema import, the EmitDefaultValue property is automatically set to false whenever the WCFWCF-specific annotation mentioned previously is detected. 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.NETASP.NET-Webdiensten auftreten.It is also set to false for reference types that have the nillable property set to false to support specific interoperability scenarios that commonly occur when consuming ASP.NETASP.NET Web services.

Siehe auchSee Also

EmitDefaultValue
DataMemberAttribute