Почему использование [DataMember (EmitDefaultValue = false)] не рекомендуется?
в WCF вы можете определить контракт, используя [DataContract]
и [DataMember]
атрибуты, вроде этого:
[DataContract]
public class Sample
{
[DataMember(EmitDefaultValue = false, IsRequired = false)]
public string Test { get; set; }
}
эта статья на MSDN утверждает, что с помощью EmitDefaultValue = false
не рекомендуется:
однако мне нравится использовать это, потому что XML, который генерируется с помощью этой конструкции, чище. Не указывая этот параметр приводит к:
<Sample>
<Test xsi:nil="true"/>
</Sample>
при использовании параметра элемент отсутствует, когда нет значение:
<Sample>
</Sample>
мне любопытно, какие рассуждения стоят за этим утверждением. В частности, поскольку оба фрагмента XML выглядят эквивалентными мне (и обе последние части могут быть десериализованы правильно для этого контракта).
каковы причины этого утверждения?
1 ответов
причина находится в нижней части статьи, на которую вы ссылаетесь. Краткая версия:
когда
EmitDefaultValue
имеет значение false, он представлен в схеме как аннотация, специфичная для Windows Communication Foundation (WCF). Не существует совместимого способа представления этой информации. В частности, атрибут "default" в схеме не используется для этой цели,minOccurs
атрибут зависит только отIsRequired
и зависит только от типа элемента данных.фактическое значение по умолчанию для использования отсутствует в схеме. Это зависит от конечной точки получения, чтобы правильно интерпретировать отсутствующий элемент.