Standardvärden för datamedlem
I .NET Framework har typer ett begrepp med standardvärden. För alla referenstyper är null
standardvärdet till exempel , och för en heltalstyp är det noll. Ibland är det önskvärt att utelämna en datamedlem från serialiserade data när den är inställd på standardvärdet. Eftersom medlemmen har ett standardvärde behöver inte ett faktiskt värde serialiseras. detta har en prestandafördel.
Om du vill utelämna en medlem från serialiserade data anger du EmitDefaultValue egenskapen DataMemberAttribute för attributet till false
(standardvärdet är true
).
Kommentar
Du bör ange EmitDefaultValue egenskapen till false
om det finns ett specifikt behov av att göra det, till exempel för samverkan eller minskning av datastorlek.
Exempel
Följande kod har flera medlemmar med värdet EmitDefaultValuefalse
.
[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
Om en instans av den här klassen serialiseras är resultatet följande: employeeName
och employeeID
serialiseras. Null-värdet för employeeName
och nollvärdet för employeeID
är uttryckligen en del av serialiserade data. Men position
medlemmarna , salary
och bonus
är inte serialiserade. targetSalary
Slutligen serialiseras som vanligt, även om EmitDefaultValue egenskapen är inställd på false
, eftersom 57800 inte matchar .NET-standardvärdet för ett heltal, vilket är noll.
XML-representation
Om det föregående exemplet serialiseras till XML liknar representationen följande.
<Employee>
<employeeName xsi:nil="true" />
<employeeID>0</employeeID>
<targetSalary>57800</targetSalary>
</Employee>
Attributet xsi:nil
är ett särskilt attribut i W3C-instansens namnområde för XML-schemainstansen (World Wide Web Consortium) som ger ett interoperabelt sätt att explicit representera ett null-värde. Observera att det inte finns någon information alls i XML om position, lön och bonusdatamedlemmar. Den mottagande änden kan tolka dessa som null
, noll null
respektive . Det finns ingen garanti för att en tredjeparts deserialiserare kan göra rätt tolkning, vilket är anledningen till att det här mönstret inte rekommenderas. Klassen DataContractSerializer väljer alltid rätt tolkning för saknade värden.
Interaktion med IsRequired
Som beskrivs i Versionshantering av DataMemberAttribute datakontrakt har attributet en IsRequired egenskap (standardvärdet är false
). Egenskapen anger om en viss datamedlem måste finnas i serialiserade data när deserialiseras. Om IsRequired
är inställt på true
, (vilket anger att ett värde måste finnas) och EmitDefaultValue är inställt false
på (vilket indikerar att värdet inte får finnas om det är inställt på dess standardvärde), kan standardvärdena för den här datamedlemmen inte serialiseras eftersom resultatet skulle vara motstridigt. Om en sådan datamedlem är inställd på sitt standardvärde (vanligtvis null
eller noll) och en serialisering görs, utlöses en SerializationException .
Schemarepresentation
Information om XSD-schemarepresentationen (XML Schema Definition Language) för datamedlemmar när EmitDefaultValue
egenskapen är inställd på beskrivs i Schemareferens för false
datakontrakt. Följande är dock en kort översikt:
EmitDefaultValue När är inställt på
false
representeras det i schemat som en kommentar som är specifik för Windows Communication Foundation (WCF). Det finns inget samverkande sätt att representera den här informationen. I synnerhet används inte attributet "standard" i schemat för detta ändamål,minOccurs
attributet påverkas endast av IsRequired inställningen ochnillable
attributet påverkas endast av datamedlemmens typ.Det faktiska standardvärdet som ska användas finns inte i schemat. Det är upp till den mottagande slutpunkten att korrekt tolka ett element som saknas.
Vid schemaimport EmitDefaultValue anges egenskapen automatiskt till false
när den WCF-specifika anteckning som nämnts tidigare identifieras. Den är också inställd false
på för referenstyper som har nillable
egenskapen inställd på för false
att stödja specifika samverkansscenarier som ofta inträffar när ASP.NET webbtjänster används.