Подтвердить что ты не робот

Почему использование [DataMember (EmitDefaultValue = false)] не рекомендуется?

В WCF вы можете определить контракт, используя атрибуты [DataContract] и [DataMember], например:

[DataContract]
public class Sample 
{
    [DataMember(EmitDefaultValue = false, IsRequired = false)]
    public string Test { get; set; }
}

В этой статье в MSDN указано, что использование EmitDefaultValue = false не рекомендуется:

snippet

Однако мне нравится использовать это, потому что XML, который создается с использованием этой конструкции, более чист. Не указывая этот параметр, выполните следующие действия:

<Sample>
    <Test xsi:nil="true"/>
</Sample>

используя параметр, когда элемент отсутствует, когда нет значения:

<Sample>
</Sample>

Мне любопытно, что такое аргументация. В частности, поскольку оба snipptes XML выглядят эквивалентно мне (и обе последние части могут быть десериализованы правильно для этого контракта).

Какова причина этого утверждения?

4b9b3361

Ответ 1

Причина в нижней части статьи, на которую вы ссылаетесь. Короткий вариант:

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

  • Фактическое значение по умолчанию для использования отсутствует в схеме. До принимающей конечной точки надлежащим образом интерпретировать отсутствующий элемент.