Condividi tramite


Valori predefiniti dei membri dati

In .NET Framework a ogni tipo è associato il concetto di valore predefinito. 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 solo 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.

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 dello schema XML 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 dei contratti dati, l'attributo DataMemberAttribute presenta la proprietà IsRequired. Questa proprietà, la cui impostazione predefinita è 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:

  • L'impostazione della proprietà EmitDefaultValue su false viene rappresentata nello schema come un'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 false ogni volta che viene rilevata la suddetta annotazione specifica di WCF. 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'utilizzo di servizi Web ASP.NET.

Vedere anche

Riferimenti

EmitDefaultValue
DataMemberAttribute