Valori predefiniti dei membri datiData Member Default Values

Nel .NET Framework.NET Framework, tipi hanno un concetto di i valori predefiniti.In the .NET Framework.NET Framework, types have a concept of default values. Ad esempio, per i tipi di riferimento il valore predefinito è null mentre per un tipo Integer è zero.For example, for any reference type the default value is null, and for an integer type it is zero. Talvolta, quando un membro dati è impostato sul relativo valore predefinito, conviene ometterlo dai dati serializzati.It is occasionally desirable to omit a data member from serialized data when it is set to its default value. Infatti, poiché il membro ha un valore predefinito, non occorre serializzare un valore effettivo. Ciò risulta vantaggioso in termini di prestazioni.Because the member has a default value, an actual value need not be serialized; this has a performance advantage.

Per omettere un membro dai dati serializzati, impostare la proprietà EmitDefaultValue dell'attributo DataMemberAttribute su false. L'impostazione predefinita è true.To omit a member from serialized data, set the EmitDefaultValue property of the DataMemberAttribute attribute to false (the default is 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.You should set the EmitDefaultValue property to false if there is a specific need to do so, such as for interoperability or data size reduction.

EsempioExample

Il codice seguente illustra vari membri in cui la proprietà EmitDefaultValue è impostata su false.The following code has several members with the EmitDefaultValue set to 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.If an instance of this class is serialized, the result is as follows: employeeName and employeeID is serialized. Il valore null di employeeName e il valore zero di employeeID appartengono esplicitamente ai dati serializzati.The null value for employeeName and the zero value for employeeID is explicitly part of the serialized data. Tuttavia, i membri position, salary e bonus non verranno serializzati.However, the position, salary, and bonus members are not serialized. 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.Finally, targetSalary is serialized as usual, even though the EmitDefaultValue property is set to false, because 57800 does not match the .NET default value for an integer, which is zero.

Rappresentazione XMLXML Representation

Se l'esempio precedente viene serializzato in XML, la rappresentazione risulta simile al codice seguente.If the previous example is serialized to XML, the representation is similar to the following.

<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.The xsi:nil attribute is a special attribute in the World Wide Web Consortium (W3C) XML Schema instance namespace that provides an interoperable way to explicitly represent a null value. Si noti che il codice XML non contiene alcuna informazione sui membri dati "position", "salary" e "bonus".Note that there is no information at all in the XML about position, salary, and bonus data members. Il destinatario può interpretare questa assenza di dati come possibilità di impostare tali membri rispettivamente come null, zero e null.The receiving end can interpret these as null, zero, and null, respectively. 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.There is no guarantee that a third-party deserializer can make the correct interpretation, which is why this pattern is not recommended. La classe DataContractSerializer imposta sempre correttamente i valori dei membri mancanti.The DataContractSerializer class always selects the correct interpretation for missing values.

Interazione con IsRequiredInteraction with IsRequired

Come descritto in controllo delle versioni del contratto dati, DataMemberAttribute presenta un IsRequired proprietà (il valore predefinito è false).As discussed in Data Contract Versioning, the DataMemberAttribute attribute has an IsRequired property (the default is false). indica se un determinato membro dati deve essere presente nei dati serializzati quando viene deserializzato.The property indicates whether a given data member must be present in the serialized data when it is being deserialized. 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.If IsRequired is set to true, (which indicates that a value must be present) and EmitDefaultValue is set to false (indicating that the value must not be present if it is set to its default value), default values for this data member cannot be serialized because the results would be contradictory. 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.If such a data member is set to its default value (usually null or zero) and a serialization is attempted, a SerializationException is thrown.

Rappresentazione dello schemaSchema Representation

I dettagli della rappresentazione dello schema di XML Schema definition language (XSD) dei membri dati quando il EmitDefaultValue è impostata su false vengono discussi in riferimento dello Schema del contratto dati.The details of the XML Schema definition language (XSD) schema representation of data members when the EmitDefaultValue property is set to false are discussed in Data Contract Schema Reference. Di seguito viene invece fornita una descrizione di carattere più generale:However, the following is a brief overview:

  • Quando il EmitDefaultValue è impostata su false, essa viene rappresentata nello schema come un'annotazione specifica di Windows Communication Foundation (WCF).When the EmitDefaultValue is set to false, it is represented in the schema as an annotation specific to Windows Communication Foundation (WCF). Non esiste alcuna modalità interoperativa per rappresentare queste informazioni.There is no interoperable way to represent this information. 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.In particular, the "default" attribute in the schema is not used for this purpose, the minOccurs attribute is affected only by the IsRequired setting, and the nillable attribute is affected only by the type of the data member.

  • Il valore predefinito effettivo da utilizzare non è presente nello schema.The actual default value to use is not present in the schema. La corretta impostazione di un elemento mancante spetta all'endpoint di destinazione.It is up to the receiving endpoint to appropriately interpret a missing element.

Importazione dello schema, il EmitDefaultValue è impostata automaticamente su false ogni volta che l'annotazione specifica di WCF indicato in precedenza è stato rilevato.On schema import, the EmitDefaultValue property is automatically set to false whenever the WCF-specific annotation mentioned previously is detected. 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.NETASP.NET.It is also set to false for reference types that have the nillable property set to false to support specific interoperability scenarios that commonly occur when consuming ASP.NETASP.NET Web services.

Vedere ancheSee Also

EmitDefaultValue
DataMemberAttribute