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の両方のスニペットは私と同等に見えます(そして、このコントラクトでは、最後の部分を両方とも正しくデシリアライズできます)。
このステートメントの背後にある理由は何ですか?
その理由は、リンクしている記事の一番下にあります。短いバージョンは次のとおりです。
EmitDefaultValue
がfalseに設定されている場合、スキーマではWindows Communication Foundation(WCF)に固有の注釈として表されます。この情報を表現する相互運用可能な方法はありません。特に、スキーマの「デフォルト」属性はこの目的には使用されず、minOccurs
属性はIsRequired
設定の影響のみを受け、nillable
属性は影響を受けますデータメンバーのタイプによってのみ。
使用する実際のデフォルト値はスキーマに存在しません。欠落している要素を適切に解釈するのは受信側のエンドポイントです。