Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In .NET Framework i tipi hanno un concetto di valori predefiniti. Ad esempio, per qualsiasi tipo di riferimento il valore predefinito è nulle per un tipo integer è zero. Occasionalmente è desiderabile omettere un membro di dati dai dati serializzati quando è impostato sul valore predefinito. Poiché il membro ha un valore predefinito, non è necessario serializzare un valore effettivo; questo ha un vantaggio per le prestazioni.
Per omettere un membro dai dati serializzati, impostare la EmitDefaultValue proprietà dell'attributo DataMemberAttribute su false (il valore predefinito è true).
Annotazioni
È necessario impostare la EmitDefaultValue proprietà su false se è necessario eseguire questa operazione, ad esempio per l'interoperabilità o la riduzione delle dimensioni dei dati.
Esempio
Il codice seguente include diversi membri con l'oggetto EmitDefaultValue impostato 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 un'istanza di questa classe viene serializzata, il risultato è il seguente: employeeName e employeeID viene serializzato. Il valore Null per employeeName e il valore zero per employeeID fa parte esplicitamente dei dati serializzati. Tuttavia, i membri position, salary e bonus non vengono serializzati. Infine, targetSalary viene serializzato come di consueto, anche se la EmitDefaultValue proprietà è impostata su false, perché 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 è simile alla seguente.
<Employee>
<employeeName xsi:nil="true" />
<employeeID>0</employeeID>
<targetSalary>57800</targetSalary>
</Employee>
L'attributo xsi:nil è un attributo speciale nello spazio dei nomi dell'istanza di XML Schema W3C (World Wide Web Consortium) che fornisce un modo interoperabile per rappresentare in modo esplicito un valore Null. Si noti che nell'XML non sono presenti informazioni sulla posizione, lo stipendio e i dati sui bonus. L'estremità ricevente può interpretare questi valori rispettivamente come null, zero e null. Non esiste alcuna garanzia che un deserializzatore di terze parti possa eseguire l'interpretazione corretta, motivo per cui questo modello non è consigliato. La DataContractSerializer classe seleziona sempre l'interpretazione corretta per i valori mancanti.
Interazione con IsRequired
Come descritto in Controllo delle versioni del contratto dati, l'attributo DataMemberAttribute ha una IsRequired proprietà (il valore predefinito è false). La proprietà indica se un determinato membro dati deve essere presente nei dati serializzati quando viene deserializzato. Se IsRequired è impostato su true, (che indica che un valore deve essere presente) ed EmitDefaultValue è impostato su false (a indicare che il valore non deve essere presente se è impostato sul valore predefinito), i valori predefiniti per questo membro dati non possono essere serializzati perché i risultati sarebbero contraddittori. Se tale membro dati è impostato sul valore predefinito (in genere null o zero) e viene tentata una serializzazione, viene sollevata un'eccezione SerializationException.
Rappresentazione dello schema
I dettagli della rappresentazione dello schema XSD (XML Schema Definition Language) dei membri dei dati quando la proprietà EmitDefaultValue è impostata su false vengono illustrati nel Riferimento allo schema del contratto dati. Di seguito è tuttavia riportata una breve panoramica:
Quando l'oggetto EmitDefaultValue è impostato su
false, viene rappresentato nello schema come annotazione specifica di Windows Communication Foundation (WCF). Non esiste alcun modo interoperabile per rappresentare queste informazioni. In particolare, l'attributo "default" nello schema non viene usato per questo scopo, l'attributominOccursè interessato solo dall'impostazione e l'attributo IsRequirednillableè interessato solo dal tipo del membro dati.Il valore predefinito effettivo da utilizzare non è presente nello schema. Spetta all'endpoint ricevente interpretare in modo appropriato un elemento mancante.
Durante l'importazione dello schema, la EmitDefaultValue proprietà viene impostata automaticamente su false ogni volta che viene rilevata l'annotazione specifica di WCF indicata in precedenza. È inoltre impostato su false per i tipi di riferimento con la nillable proprietà impostata su false per supportare scenari di interoperabilità specifici che si verificano comunemente quando si utilizzano ASP.NET servizi Web.