Почему не рекомендуется использовать [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 выглядят эквивалентно мне (и обе последние части могут быть правильно десериализованы для этого контракта).

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


person oɔɯǝɹ    schedule 21.03.2011    source источник


Ответы (1)


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

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

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

person Shiraz Bhaiji    schedule 21.03.2011
comment
Важной частью этого, кажется, является интероперабельность. Если вы используете технологию .net на обеих сторонах вызова и строго типизированные контракты данных, у вас не должно возникнуть проблем. - person Gent; 04.09.2014