Valori predefiniti dei membri dati
In .NET Framework i tipi hanno un concetto di valori predefiniti. Ad esempio, per i tipi di riferimento il valore predefinito è null
mentre per un tipo Integer è zero. Talvolta, quando un membro dati è impostato sul relativo valore predefinito, conviene ometterlo dai dati serializzati. Infatti, poiché il membro ha un valore predefinito, non occorre serializzare un valore effettivo. Ciò risulta vantaggioso in termini di prestazioni.
Per omettere un membro dai dati serializzati, impostare la proprietà EmitDefaultValue dell'attributo DataMemberAttribute su false
. L'impostazione predefinita è true
.
Nota
È consigliabile impostare la proprietà EmitDefaultValue su false
se esiste un'esigenza specifica da soddisfare, ad esempio fornire interoperabilità o ridurre le dimensioni dei dati.
Esempio
Il codice seguente illustra vari membri in cui la proprietà EmitDefaultValue è impostata su 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
Se si serializza un'istanza di questa classe, si verifica quanto segue: employeeName
e employeeID
vengono serializzati. Il valore null di employeeName
e il valore zero di employeeID
appartengono esplicitamente ai dati serializzati. Tuttavia, i membri position
, salary
e bonus
non verranno serializzati. Infine, targetSalary
viene serializzato normalmente, anche se la relativa proprietà EmitDefaultValue è impostata su false
. Infatti, 57800 non corrisponde al valore predefinito .NET per un numero intero, ovvero zero.
Rappresentazione XML
Se l'esempio precedente viene serializzato in XML, la rappresentazione risulta simile al codice seguente.
<Employee>
<employeeName xsi:nil="true" />
<employeeID>0</employeeID>
<targetSalary>57800</targetSalary>
</Employee>
L'attributo xsi:nil
è un attributo speciale dello spazio dei nomi delle istanze dell'XML Schema del W3C (World Wide Web Consortium) che fornisce un modo interoperativo per rappresentare in modo esplicito un valore nullo. Si noti che il codice XML non contiene alcuna informazione sui membri dati "position", "salary" e "bonus". Il destinatario può interpretare questa assenza di dati come possibilità di impostare tali membri rispettivamente come null
, zero e null
. Non esiste alcuna garanzia che un deserializzatore di terze parti esegua correttamente l'impostazione dei valori. È per questo motivo che è consigliabile evitare di utilizzare questo modello. La classe DataContractSerializer imposta sempre correttamente i valori dei membri mancanti.
Interazione con IsRequired
Come descritto in Controllo delle versioni del contratto dati, l'attributo DataMemberAttribute ha una proprietà IsRequired (il valore predefinito è false
). indica se un determinato membro dati deve essere presente nei dati serializzati quando viene deserializzato. Se la proprietà IsRequired
viene impostata su true
(a indicare che un valore deve essere presente) e la proprietà EmitDefaultValue viene impostata su false
(a indicare che il valore non deve essere presente se è impostato sul valore predefinito), i valori predefiniti del membro dati non possono essere serializzati perché i risultati sarebbero contraddittori. Se il membro dati è impostato sul valore predefinito (in genere null
o zero) e si tenta di eseguire una serializzazione, viene generata un'eccezione SerializationException.
Rappresentazione dello schema
L'argomento Riferimento allo schema del contratto dati contiene una descrizione dettagliata della rappresentazione dello schema XSD (XML Schema Definition Language) dei membri dati in cui la proprietà EmitDefaultValue
è impostata su false
. Di seguito viene invece fornita una descrizione di carattere più generale:
Quando l'oggetto EmitDefaultValue è impostato su
false
, viene rappresentato nello schema come annotazione specifica di Windows Communication Foundation (WCF). Non esiste alcuna modalità interoperativa per rappresentare queste informazioni. In particolare, l'attributo "default" dello schema non viene utilizzato per indicare un valore predefinito, l'attributominOccurs
dipende esclusivamente dall'impostazione IsRequired e l'attributonillable
dipende soltanto dal tipo del membro dati.Il valore predefinito effettivo da utilizzare non è presente nello schema. La corretta impostazione di un elemento mancante spetta all'endpoint di destinazione.
Quando si importa lo schema, la proprietà EmitDefaultValue viene impostata automaticamente su ogni volta che viene rilevata la suddetta annotazione specifica di false
. Tale proprietà viene impostata su false
anche per i tipi di riferimento la cui proprietà nillable
è impostata su false
per supportare scenari di interoperabilità specifici che spesso si verificano durante l'uso di servizi Web ASP.NET.