Freigeben über


Standardwerte der Datenelemente

In .NET Framework weisen Typen ein Konzept von Standardwerten auf. Zum Beispiel ist für jeden Referenztyp der Standardwert null, und für einen Ganzzahltyp ist er null. Es ist gelegentlich wünschenswert, ein Datenelement aus serialisierten Daten auszulassen, wenn es auf seinen Standardwert festgelegt ist. Da das Element über einen Standardwert verfügt, muss ein tatsächlicher Wert nicht serialisiert werden. dies hat einen Leistungsvorteil.

Um ein Mitglied aus serialisierten Daten wegzulassen, setzen Sie die Eigenschaft des EmitDefaultValue-Attributs auf DataMemberAttribute. Der Standardwert ist false.

Hinweis

Sie sollten die EmitDefaultValue-Eigenschaft auf false setzen, wenn dies erforderlich ist, beispielsweise für die Interoperabilität oder die Größenreduzierung von Daten.

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, lautet das Ergebnis wie folgt: employeeName und employeeID wird 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 in XML serialisiert ist, ähnelt die Darstellung folgendem.

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

Das xsi:nil Attribut ist ein spezielles Attribut im W3C-XML-Schemainstanznamespace (World Wide Web Consortium), das eine interoperable Methode zum expliziten Darstellen eines Nullwerts bereitstellt. Bitte beachten Sie, dass es im XML keinerlei Informationen über die Datenelemente Position, Gehalt und Bonus gibt. Das empfangende Ende kann diese als null, Null und null interpretieren. Es gibt keine Garantie, dass einem Fremdanbieterdeserialisierer eine korrekte Auslegung gelingt; daher wird dieses Muster nicht empfohlen. Die DataContractSerializer Klasse wählt immer die richtige Interpretation für fehlende Werte aus.

Interaktion mit IsRequired

Wie in der Datenvertragsversionsverwaltung erläutert, weist das DataMemberAttribute Attribut eine IsRequired Eigenschaft auf (der Standardwert ist false). Die Eigenschaft gibt an, ob ein bestimmtes Datenelement in den serialisierten Daten vorhanden sein muss, wenn es deserialisiert wird. Wenn IsRequired auf true gesetzt ist (was angibt, dass ein Wert vorhanden sein muss) und EmitDefaultValue auf false gesetzt ist (was angibt, dass der Wert nicht vorhanden sein darf, wenn dieser auf seinen Standardwert festgelegt ist), können Standardwerte für dieses Datenmitglied nicht serialisiert werden, da die Ergebnisse widersprüchlich wären. Wenn ein solches Datenelement auf seinen Standardwert (in der Regel null oder Null) festgelegt ist und eine Serialisierung versucht wird, wird ein SerializationException Fehler ausgelöst.

Schemadarstellung

Die Details der XML-Schemadefinitionssprache (XSD)-Schemadarstellung von Datenmitgliedern werden erläutert in der EmitDefaultValue, wenn die false-Eigenschaft auf gesetzt ist. Es folgt jedoch eine kurze Übersicht:

  • Wenn die EmitDefaultValue auf false gesetzt wird, wird sie im Schema als eine Anmerkung dargestellt, die spezifisch für Windows Communication Foundation (WCF) ist. Es gibt keine interoperable Möglichkeit, diese Informationen darzustellen. Insbesondere wird das Attribut "default" im Schema nicht für diesen Zweck verwendet, das minOccurs Attribut ist nur von der IsRequired Einstellung betroffen, und das nillable Attribut wird nur vom Typ des Datenmemems beeinflusst.

  • Der tatsächliche zu verwendende Standardwert ist im Schema nicht vorhanden. Es liegt an dem empfangenden Endpunkt, ein fehlendes Element entsprechend zu interpretieren.

Beim Schemaimport wird die EmitDefaultValue Eigenschaft automatisch auf false festgelegt, wenn die zuvor erwähnte WCF-spezifische Anmerkung erkannt wird. Sie wird auch auf false für Referenztypen gesetzt, deren nillable Eigenschaft auf false gesetzt wird, um bestimmte Interoperabilitätsszenarien zu unterstützen, die häufig auftreten, wenn ASP.NET-Webdienste genutzt werden.

Siehe auch