0

WCFとXMLの逆シリアル化について質問があります。

minoccurs='0'としていくつかの属性を指定するXSDがあるとします。

<xs:element name=TestData>
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs=0 name="stoppageHours>
        <xs:simpleType>
          <xs:restriction base="xs:int">
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element minOccurs=0 name="stoppageDate>
        <xs:simpleType>
          <xs:restriction base="xs:dateTime">
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    <xs:sequence>
  <xs:complexType>
</xs:element>

属性の値がない場合は、XMLの要素タグを省略できます。

<TestData>
  <StoppageHours>26</StoppageHours>
  ...omitted stoppageDate...
</TestData>

しかし、XSDから.NET c#にクラスを生成したことを考えると、XMLをWebサービスに投稿すると、要素を予期していたため、逆シリアル化が失敗したと文句を言います。

デシリアリスト化プロセスに欠落しているXML要素を無視させ、問題のクラスメンバーをNULL値に設定するにはどうすればよいですか?クラスメンバーをシステムのnull許容型に設定しようとしましたが、これを機能させるには、XML要素をxsi:nillableとして渡す必要がありますか?私が本当にやりたいのは、XMLタグを省略することです。

ありがとう。

4

1 に答える 1

0

この機能を可能にする属性はEmitDefaultValueと呼ばれます。サービス側のデータ コントラクトは、おそらく次のようになります。

[DataContract]
public class TestData
{
    [DataMember(EmitDefaultValue = false)]
    public int StoppageHours { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public DateTime StoppageDate { get; set; }
}

EmitDefaultValue が false の場合、WCF のデータ コントラクト シリアライザーに対して、要素の値が既定値と等しい場合に要素を入力から削除するように指示します。値型の場合、値が存在しない場合、シリアライザーはサーバー側で値をデフォルト値に設定します。したがって、このシナリオで合格した場合

<TestData></TestData> 

WCF によって受信されると、オブジェクトはサーバー側で次の値を持ちます。

<TestData>
    <StoppageHours>0</StoppageHours>
    <StoppageDate>1/1/0001 12:00:00 AM</StoppageDate>
</TestData>

編集: フィードバック コメントに基づいて行う必要があるその他のことは、DataMember にもIsRequired属性を設定することです。私がテストしたところ、この属性はデフォルトで false になっているはずですが、コントラクト定義で明示的にすることができます。更新されたコントラクトは次のようになります。

[DataContract]
public class TestData
{
    [DataMember(IsRequired = false, EmitDefaultValue = false)]
    public int StoppageHours { get; set; }

    [DataMember(IsRequired = false, EmitDefaultValue = false)]
    public DateTime StoppageDate { get; set; }
}

値が true に設定され、ノードが見つからない場合、シリアライゼーション例外が発生します。IsRequired が false に設定されている場合、空のリクエストを送信できます。

<TestData></TestData>

シリアル化の例外はありません。これが機能しない場合は、一時的な asp.net ファイルをクリアして、サービスを再起動する必要がある場合があります。これをテストしたときにその問題が発生しました。お役に立てれば。

于 2012-08-06T19:07:57.343 に答える