Почему использование [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>

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

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

1 ответов


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

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

  • фактическое значение по умолчанию для использования отсутствует в схеме. Это зависит от конечной точки получения, чтобы правильно интерпретировать отсутствующий элемент.