Sdílet prostřednictvím


Výchozí hodnoty datového člena

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:

Měli byste nastavit vlastnost EmitDefaultValue na hodnotu false, pokud existuje konkrétní potřeba, například kvůli interoperabilitě nebo zmenšení velikosti dat.

Příklad

Následující kód má několik prvků, které mají EmitDefaultValue nastaveno 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 pro employeeName a nulová hodnota pro employeeID jsou explicitně součástí serializovaných dat. Nicméně position, salary a bonus členové 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 verzování datového kontraktu, DataMemberAttribute 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 dojde k pokusu o serializaci, vyvolá se SerializationException.

Reprezentace schématu

Podrobnosti o reprezentaci schématu jazyka XML Schema Definition (XSD) pro datové členy, když je vlastnost EmitDefaultValue nastavena na false, jsou popsány v části Odkaz na schéma datového kontraktu. 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 IsRequired atribut je ovlivněn pouze nillable 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ě interpretoval 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 na false pro typy odkazu, které mají nillable vlastnost nastavenou na false, aby podporovaly konkrétní scénáře interoperability, které se běžně vyskytují při využívání webových služeb ASP.NET.

Viz také