Partilhar via


Valores padrão do membro de dados

No .NET Framework, os tipos têm um conceito de valores padrão. Por exemplo, para qualquer tipo de referência o valor padrão é null, e para um tipo inteiro é zero. Ocasionalmente, é desejável omitir um membro de dados de dados serializados quando ele é definido como seu valor padrão. Como o membro tem um valor padrão, um valor real não precisa ser serializado; Isso tem uma vantagem de desempenho.

Para omitir um membro dos dados serializados, defina a EmitDefaultValueDataMemberAttribute propriedade do atributo como false (o padrão é true).

Nota

Você deve definir a EmitDefaultValue propriedade como false se houver uma necessidade específica de fazê-lo, como para interoperabilidade ou redução de tamanho de dados.

Exemplo

O código a seguir tem vários membros com o EmitDefaultValue conjunto como 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 uma instância dessa classe for serializada, o resultado será o seguinte: employeeName e employeeID será serializado. O valor nulo para employeeName e o valor zero para employeeID é explicitamente parte dos dados serializados. No entanto, o position, salarye bonus os membros não são serializados. Finalmente, targetSalary é serializado como de costume, mesmo que a EmitDefaultValue propriedade esteja definida como false, porque 57800 não corresponde ao valor padrão do .NET para um inteiro, que é zero.

Representação XML

Se o exemplo anterior for serializado para XML, a representação será semelhante à seguinte.

<Employee>  
   <employeeName xsi:nil="true" />  
   <employeeID>0</employeeID>  
<targetSalary>57800</targetSalary>  
</Employee>  

O xsi:nil atributo é um atributo especial no namespace de instância do esquema XML do World Wide Web Consortium (W3C) que fornece uma maneira interoperável de representar explicitamente um valor nulo. Observe que não há nenhuma informação no XML sobre cargo, salário e dados de bônus dos membros. A extremidade recetora pode interpretá-los como null, zero e null, respectivamente. Não há garantia de que um desserializador de terceiros possa fazer a interpretação correta, e é por isso que esse padrão não é recomendado. A DataContractSerializer classe sempre seleciona a interpretação correta para valores ausentes.

Interação com IsRequired

Conforme discutido em Controle de versão de contrato de dados, o DataMemberAttribute atributo tem uma IsRequired propriedade (o padrão é false). A propriedade indica se um determinado membro de dados deve estar presente nos dados serializados quando ele está sendo desserializado. Se IsRequired estiver definido como true, (o que indica que um valor deve estar presente) e EmitDefaultValue estiver definido como false (indicando que o valor não deve estar presente se estiver definido como seu valor padrão), os valores padrão para esse membro de dados não poderão ser serializados porque os resultados seriam contraditórios. Se esse membro de dados for definido como seu valor padrão (geralmente null ou zero) e uma serialização for tentada, um SerializationException será lançado.

Representação de Esquemas

Os detalhes da representação de esquema XSD (linguagem de definição de esquema XML) de membros de dados quando a EmitDefaultValue propriedade é definida como false são discutidos em Referência de esquema de contrato de dados. No entanto, segue-se uma breve visão geral:

  • Quando o é definido como false, ele é representado no esquema como uma anotação específica para o EmitDefaultValue Windows Communication Foundation (WCF). Não existe uma forma interoperável de representar esta informação. Em particular, o atributo "default" no esquema não é usado para essa finalidade, o minOccurs atributo é afetado IsRequired apenas pela configuração e o nillable atributo é afetado apenas pelo tipo do membro de dados.

  • O valor padrão real a ser usado não está presente no esquema. Cabe ao ponto final recetor interpretar adequadamente um elemento ausente.

Na importação de esquema, a EmitDefaultValue propriedade é automaticamente definida como false sempre que a anotação específica do WCF mencionada anteriormente é detetada. Ele também é definido como false para tipos de referência que têm a nillable propriedade definida para false oferecer suporte a cenários específicos de interoperabilidade que normalmente ocorrem ao consumir serviços Web ASP.NET.

Consulte também