Standaardwaarden voor gegevenslid
In .NET Framework hebben typen een concept van standaardwaarden. Voor elk verwijzingstype is null
de 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
, salary
en 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 null
respectievelijk 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 true
op , (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
false
op , 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, hetminOccurs
kenmerk wordt alleen beïnvloed door de IsRequired instelling en hetnillable
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.