Dela via


Standardvärden för datamedlem

I .NET Framework har typer ett begrepp med standardvärden. För alla referenstyper är nullstandardvä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 positionmedlemmarna , salaryoch 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 nullrespektive . 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å falserepresenteras 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 och nillable 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.

Se även