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'attributo minOccurs dipende esclusivamente dall'impostazione IsRequired e l'attributo nillable 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.

Vedi anche