Compartilhar via


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 valor padrão é nulle, 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 de dados serializados, defina a EmitDefaultValue propriedade do DataMemberAttribute atributo como false (o padrão é true).

Observação

Você deve definir a EmitDefaultValue propriedade para false se houver 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 definidos 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 são 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 xsi:nil atributo é 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. O receptor pode interpretá-los como null, zero e null, respectivamente. Não há nenhuma garantia de que um desserializador de terceiros possa fazer a interpretação correta, razão pela qual 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 Versionamento de Contrato de Dados, o atributo DataMemberAttribute possui uma propriedade IsRequired (o padrão é false). A propriedade indica se um determinado membro de dados deve estar presente nos dados serializados quando eles estão sendo desserializados. Se IsRequired estiver definido como true, (o que indica que um valor deve estar presente) e EmitDefaultValue for definido false como (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 uma serialização for tentada, um SerializationException será gerado.

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, o seguinte é uma breve visão geral:

  • Quando definido EmitDefaultValue como false, ele é representado no esquema como uma anotação específica para o 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 minOccurs atributo é afetado apenas pela IsRequired 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 de extremidade de recebimento interpretar adequadamente um elemento ausente.

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

Consulte também