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

В 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 Ответ

23 голосов
/ 21 марта 2011

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

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

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

...