Vychozí hodnoty datových členů

V rozhraní .NET Framework mají typy koncept výchozích hodnot. Například pro každý typ odkazu je výchozí hodnota nulla pro celočíselné typ je nula. Občas je žádoucí vynechat datový člen ze serializovaných dat, pokud je nastavena na výchozí hodnotu. Vzhledem k tomu, že člen má výchozí hodnotu, skutečná hodnota nemusí být serializována; to má výhodu výkonu.

Chcete-li vynechat člen ze serializovaných dat, nastavte EmitDefaultValue vlastnost atributu DataMemberAttribute ( false výchozí hodnota je true).

Poznámka:

Vlastnost byste měli nastavit EmitDefaultValue tak, aby false byla určitá potřeba, například pro interoperabilitu nebo zmenšení velikosti dat.

Příklad

Následující kód má několik členů se nastavenou EmitDefaultValue na 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

Pokud je instance této třídy serializována, výsledek je následující: employeeName a employeeID je serializován. Hodnota null a employeeName nulová hodnota pro employeeID je explicitně součástí serializovaných dat. Nicméně , positionsalarya bonus členy nejsou serializovány. Nakonec je targetSalary serializován jako obvykle, i když EmitDefaultValue je vlastnost nastavena na false, protože 57800 neodpovídá výchozí hodnotě .NET pro celé číslo, což je nula.

Reprezentace XML

Pokud je předchozí příklad serializován do XML, reprezentace je podobná následující.

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

Atribut xsi:nil je speciální atribut v oboru názvů instance schématu XML w3C (World Wide Web Consortium), který poskytuje interoperabilní způsob, jak explicitně reprezentovat hodnotu null. Všimněte si, že xml neobsahuje žádné informace o pozici, platu a bonusových datových členech. Přijímající konec je může interpretovat jako null, nula a null, v uvedeném pořadí. Neexistuje žádná záruka, že deserializátor třetí strany může provést správnou interpretaci, což je důvod, proč se tento model nedoporučuje. Třída DataContractSerializer vždy vybere správnou interpretaci chybějících hodnot.

Interakce s isRequired

Jak je popsáno ve správě verzí kontraktu DataMemberAttribute dat, atribut má IsRequired vlastnost (výchozí hodnota je false). Vlastnost určuje, zda daný datový člen musí být přítomn v serializovaných datech, když je deserializován. Je-li IsRequired nastavena na truehodnotu , (což označuje, že hodnota musí být přítomna) a EmitDefaultValue je nastavena na false (označující, že hodnota nesmí být přítomna, pokud je nastavena na výchozí hodnotu), výchozí hodnoty pro tento datový člen nelze serializovat, protože výsledky by byly v rozporu. Pokud je takový datový člen nastaven na výchozí hodnotu (obvykle null nebo nula) a serializace se pokusí, SerializationException vyvolá se vyvolá.

Reprezentace schématu

Podrobnosti o reprezentaci schématu XSD (XML Schema Definition Language) datových členů při EmitDefaultValue nastavení false vlastnosti jsou popsány v odkazu na schéma kontraktu dat. Stručný přehled je však následující:

  • Pokud je nastavena EmitDefaultValue na false, je reprezentována ve schématu jako poznámka specifická pro Windows Communication Foundation (WCF). Neexistuje žádný interoperabilní způsob, jak tyto informace znázorňovat. Konkrétně se pro tento účel nepoužívá atribut default ve schématu, minOccurs atribut je ovlivněn pouze nastavením a nillable atribut je ovlivněn pouze IsRequired typem datového členu.

  • Skutečná výchozí hodnota, která se má použít, není ve schématu. Je na přijímajícím koncovém bodu, aby správně interpretovat chybějící prvek.

Při importu schématu EmitDefaultValue se vlastnost automaticky nastaví na false vždy, když se zjistí dříve uvedená poznámka specifická pro WCF. Je také nastavena pro false odkazové typy, které mají nillable vlastnost nastavenou tak, aby false podporovaly konkrétní scénáře interoperability, které se běžně vyskytují při využívání ASP.NET webových služeb.

Viz také