Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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, dasminOccurs
Attribut ist nur von der IsRequired Einstellung betroffen, und dasnillable
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.