Почему использование [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 выглядят эквивалентно мне (и обе последние части могут быть десериализованы правильно для этого контракта).
Какова причина этого утверждения?
Ответы
Ответ 1
Причина в нижней части статьи, на которую вы ссылаетесь. Короткий вариант:
-
Если для параметра EmitDefaultValue
установлено значение false, оно представлено в схеме как аннотация, относящаяся к Windows Communication Foundation (WCF). Существует не совместимый способ представления этой информации. В частности, атрибут "default" в схеме не используется для этой цели, атрибут minOccurs
зависит только от параметра IsRequired
, а атрибут nillable
зависит только от типа элемента данных.
-
Фактическое значение по умолчанию для использования отсутствует в схеме. До принимающей конечной точки надлежащим образом интерпретировать отсутствующий элемент.