Delen via


Standaardwaarden voor gegevenslid

In .NET Framework hebben typen een concept van standaardwaarden. Voor elk verwijzingstype is nullde standaardwaarde bijvoorbeeld en voor een geheel getal is dit nul. Het is af en toe wenselijk om een gegevenslid weg te laten uit geserialiseerde gegevens wanneer deze is ingesteld op de standaardwaarde. Omdat het lid een standaardwaarde heeft, hoeft een werkelijke waarde niet te worden geserialiseerd; dit heeft een prestatievoordeel.

Als u een lid wilt weglaten uit geserialiseerde gegevens, stelt u de EmitDefaultValue eigenschap van het DataMemberAttribute kenmerk false in op (de standaardwaarde is true).

Notitie

Stel de EmitDefaultValue eigenschap false in op als er een specifieke noodzaak is om dit te doen, zoals voor interoperabiliteit of het verminderen van de gegevensgrootte.

Opmerking

De volgende code heeft verschillende leden met de EmitDefaultValue set op 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

Als een exemplaar van deze klasse wordt geserialiseerd, is het resultaat als volgt: employeeName en employeeID wordt geserialiseerd. De null-waarde voor employeeName en de nulwaarde voor employeeID maakt expliciet deel uit van de geserialiseerde gegevens. De position, salaryen bonus leden worden echter niet geserialiseerd. Ten slotte targetSalary wordt geserialiseerd zoals gebruikelijk, ook al is de EmitDefaultValue eigenschap ingesteld op false, omdat 57800 niet overeenkomt met de standaardwaarde van .NET voor een geheel getal, dat nul is.

XML-weergave

Als het vorige voorbeeld wordt geserialiseerd naar XML, is de weergave vergelijkbaar met het volgende.

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

Het xsi:nil kenmerk is een speciaal kenmerk in de W3C-naamruimte van het XML-schema-exemplaar (World Wide Web Consortium) die een interoperabele manier biedt om expliciet een null-waarde weer te geven. Houd er rekening mee dat er helemaal geen informatie beschikbaar is in de XML over functie-, salaris- en bonusgegevens. Het ontvangende einde kan deze interpreteren als nullrespectievelijk nul en null, . Er is geen garantie dat een deserializer van derden de juiste interpretatie kan maken, daarom wordt dit patroon niet aanbevolen. De DataContractSerializer klasse selecteert altijd de juiste interpretatie voor ontbrekende waarden.

Interactie met IsRequired

Zoals besproken in Data Contract Versioning, heeft het DataMemberAttribute kenmerk een IsRequired eigenschap (de standaardinstelling).false De eigenschap geeft aan of een gegeven gegevenslid aanwezig moet zijn in de geserialiseerde gegevens wanneer deze wordt gedeserialiseerd. Als IsRequired dit is ingesteld trueop , (wat aangeeft dat een waarde aanwezig moet zijn) en EmitDefaultValue is ingesteld false op (waarmee wordt aangegeven dat de waarde niet aanwezig mag zijn als deze is ingesteld op de standaardwaarde), kunnen standaardwaarden voor dit gegevenslid niet worden geserialiseerd omdat de resultaten tegenstrijdig zouden zijn. Als een dergelijk gegevenslid is ingesteld op de standaardwaarde (meestal null of nul) en er een serialisatie wordt uitgevoerd, wordt er een SerializationException gegenereerd.

Schemaweergave

De details van de XSD-schemaweergave (XML Schema Definition Language) van gegevensleden waarop de EmitDefaultValue eigenschap is ingesteld false , worden besproken in datacontractschemareferentie. Het volgende is echter een kort overzicht:

  • Wanneer de EmitDefaultValue eigenschap is ingesteld falseop , wordt deze in het schema weergegeven als een aantekening die specifiek is voor Windows Communication Foundation (WCF). Er is geen interoperabele manier om deze informatie weer te geven. Het kenmerk 'standaard' in het schema wordt niet gebruikt voor dit doel, het minOccurs kenmerk wordt alleen beïnvloed door de IsRequired instelling en het nillable kenmerk wordt alleen beïnvloed door het type gegevenslid.

  • De werkelijke standaardwaarde die moet worden gebruikt, is niet aanwezig in het schema. Het is aan het ontvangende eindpunt om een ontbrekend element op de juiste wijze te interpreteren.

Bij het importeren van het schema wordt de EmitDefaultValue eigenschap automatisch ingesteld false op wanneer de eerder genoemde WCF-specifieke aantekening wordt gedetecteerd. Het is ook ingesteld op false referentietypen waarvoor de nillable eigenschap is ingesteld ter false ondersteuning van specifieke interoperabiliteitsscenario's die vaak optreden bij het verbruik van ASP.NET webservices.

Zie ook