Значения членов данных по умолчанию

В платформа .NET Framework типы имеют концепцию значений по умолчанию. Например, любой ссылочный тип имеет значение по умолчанию null, а значением по умолчанию для целого типа является ноль. Иногда требуется исключить член данных из сериализованных данных, если для него задано значение по умолчанию. Так как этот член имеет значение по умолчанию, нет необходимости сериализовывать фактическое значение; это повышает производительность.

Чтобы исключить член из сериализованных данных, задайте для свойства EmitDefaultValue атрибута DataMemberAttribute значение false (по умолчанию задано значение true).

Примечание.

Присваивать значение EmitDefaultValue свойству false следует только при конкретной необходимости, например для обеспечения взаимодействия или для уменьшения объема данных.

Пример

В следующем коде у нескольких членов для свойства EmitDefaultValue задано значение 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

При сериализации экземпляра этого класса получается следующее: employeeName и employeeID сериализуются. Значение "null" для employeeName и нулевое значение для employeeID в явном виде указаны в сериализованных данных. Однако члены position, salary и bonus не сериализуются. Наконец, член targetSalary сериализуется как обычно, хотя для свойства EmitDefaultValue задано значение false, так как 57800 не соответствует принятому в платформе .NET значению по умолчанию для целого числа (а именно, ноль).

Представление XML

При сериализации предыдущего примера в XML представление аналогично приведенному ниже.

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

Атрибут xsi:nil является специальным атрибутом в пространстве имен экземпляров схемы XML интернет-консорциума (W3C), который обеспечивает совместимый способ явного указания значения "null". Обратите внимание, что в XML полностью отсутствует информация о членах данных со сведениями о должности, окладе и бонусах. Получатель может интерпретировать их как значения null, ноль и null соответственно. Не гарантируется, что десериализатор независимого разработчика выполнит правильную интерпретацию, поэтому не рекомендуется использовать такую схему. Класс DataContractSerializer всегда выбирает правильную интерпретацию для отсутствующих значений.

Взаимодействие со свойством IsRequired

Как описано в разделе "Управление версиями контракта данных", DataMemberAttribute атрибут имеет IsRequired свойство (значение по умолчанию — false). Это свойство указывает, должен ли определенный член данных присутствовать в сериализованных данных при десериализации. Если для свойства IsRequired задано значение true (означающее, что значение должно присутствовать), а для свойства EmitDefaultValue задано значение false (указывающее, что если значение равно значению по умолчанию, то оно может отсутствовать), сериализация значений по умолчанию для этого члена данных невозможна, так как результат будет противоречивым. Если для такого члена данных задано значение по умолчанию (обычно null или ноль) и производится попытка сериализации, возникает исключение SerializationException.

Представление схемы

Сведения о языке определения схемы XML (XSD) представления элементов данных при EmitDefaultValue обсуждении свойства false в справочнике по схеме контракта данных. Тем не менее ниже приводятся краткие общие сведения:

  • EmitDefaultValue Если задано falseзначение, оно представлено в схеме как заметка, относящаяся к Windows Communication Foundation (WCF). Не существует совместимого способа представления этой информации. В частности, атрибут "default" в схеме не используется для этой цели, на атрибут minOccurs влияет только параметр IsRequired, а на атрибут nillable влияет только тип члена данных.

  • Фактическое значение по умолчанию, которое требуется использовать, в этой схеме отсутствует. Правильная интерпретация отсутствующего элемента зависит только от принимающей конечной точки.

При импорте EmitDefaultValue схемы свойство автоматически устанавливается false при обнаружении упоминание заметки wcF. false Для ссылочных типов, имеющих свойствоfalse, для поддержки конкретных сценариев взаимодействия, nillable которые обычно возникают при использовании веб-служб ASP.NET.

См. также