32

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 の両方のスニペットが私と同等に見えるためです (そして、最後の部分は両方とも、このコントラクトに対して正しく逆シリアル化できます)。

この声明の背後にある理由は何ですか?

4

1 に答える 1

23

その理由は、リンク先の記事の下部にあります。短いバージョンは次のとおりです。

  • がfalseに設定されている場合EmitDefaultValue、スキーマではWindows Communication Foundation(WCF)に固有の注釈として表されます。この情報を表す相互運用可能な方法はありません。特に、スキーマの「デフォルト」属性はこの目的には使用されず、minOccurs属性はIsRequired設定によってのみnillable影響を受け、属性はデータメンバーのタイプによってのみ影響を受けます。

  • 使用する実際のデフォルト値はスキーマに存在しません。欠落している要素を適切に解釈するのは、受信側のエンドポイント次第です。

于 2011-03-21T19:21:09.910 に答える