Valores padrões de 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 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 dá uma vantagem ao desempenho.

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

Observação

Você deve definir a propriedade EmitDefaultValue como false caso haja uma necessidade específica de fazer isso, como para interoperabilidade ou redução de tamanho de dados.

Exemplo

O código a seguir tem vários membros com o EmitDefaultValue definido 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ão serializados. O valor nulo de employeeName e o valor zero de employeeID é explicitamente parte dos dados serializados. No entanto, os membros position, salary e bonus não são serializados. Por fim, targetSalary é serializado como de costume, mesmo que a propriedade EmitDefaultValue 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 atributo xsi:nil é um atributo especial no namespace da instância de esquema XML do W3C (World Wide Web Consortium) que fornece uma maneira interoperável de representar explicitamente um valor nulo. Observe que não há nenhuma informação no XML sobre posição, salário e bônus de membros de dados. A extremidade de recebimento pode interpretá-las como null, zero e null, respectivamente. Não há garantia de que um desserializador de terceiros possa fazer a interpretação correta, razão pela qual esse padrão não é recomendado. A classe DataContractSerializer sempre seleciona a interpretação correta para valores ausentes.

Interação com IsRequired

Conforme discutido no Controle de Versão do Contrato de Dados, o atributo DataMemberAttribute tem uma propriedade IsRequired (o padrão é false). A propriedade indica se um determinado membro de dados deve estar presente nos dados serializados quando ele estiver sendo desserializado. Se IsRequired for definido como true, (o que indica que um valor deve estar presente) e EmitDefaultValue é definido como false (indicando que o valor não deve estar presente se ele estiver definido como seu valor padrão), os valores padrão para esse membro de dados não podem 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 houver uma tentativa de serialização, será lançado um SerializationException.

Representação de esquema

Os detalhes da representação de esquema XSD (linguagem de definição de esquema XML) de membros de dados quando a propriedade EmitDefaultValue é definida como false serão discutidos em Referência de Esquema de Contrato de Dados. No entanto, a seguir uma breve visão geral:

  • Quando EmitDefaultValue é definido como false, ele é representado no esquema como uma anotação específica do WCF (Windows Communication Foundation). Não há nenhuma maneira interoperável de representar essas informações. Em particular, o atributo "padrão" no esquema não é usado para essa finalidade, o atributo minOccurs é afetado apenas pela configuração de IsRequired e o atributo nillable é 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 de extremidade de recebimento interpretar adequadamente um elemento ausente.

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

Confira também