Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В .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). Нет совместимого способа представить эту информацию. В частности, атрибут по умолчанию в схеме не используется для этой цели,minOccursатрибут зависит только от настройки IsRequired, аnillableатрибут зависит только от типа элемента данных.Фактическое значение по умолчанию, используемое, отсутствует в схеме. Ответственность за правильную интерпретацию отсутствующего элемента лежит на принимающей конечной точке.
При импорте схемы свойство EmitDefaultValue автоматически устанавливается на false, когда обнаруживается ранее упоминаемая аннотация, специфичная для WCF. Также устанавливается значение false для ссылочных типов, у которых свойство nillable установлено в false, чтобы поддерживать конкретные сценарии взаимодействия, которые часто встречаются при использовании веб-служб ASP.NET.