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 null
a 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ě , position
salary
a 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 true
hodnotu , (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 anillable
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.