2

最近、WSDLが特定のフィールドの整数を指定するSOAP Webサービスで問題が発生しましたが、XMLには空の要素が含まれているため、.NET逆シリアル化ロジックでFormatExceptionがスローされます。

WSDLは次のようになります。

<xsd:element minOccurs="0" maxOccurs="1" name="TransID" type="xsd:int" />

そして、SOAPは次のよ​​うになります。

<TransID></TransID>

これにより、応答を解析するときに例外が発生します。私が話しているサーバーはベンダーのものであるため、変更することはできません。フィールドを文字列として再定義することで、短期的にこれをハッキングしています。

私の質問はこれです:この問題を診断しようとして、私はXMLをファイルに取り出し、WSDLインポートによって生成されたPOCOを使用して逆シリアル化をテストするために独自のXmlSerializerを作成しました。私が作成したXmlSerializerは、このXMLを適切に解析し、期待どおりに親型を生成します。例外なし。フィールド値はゼロであり、これは予想されることです。私が作成したSOAPデシリアライザーpukeとプレーンデシリアライザーが正常に機能するのはなぜですか?

4

2 に答える 2

2

これは正常であり、予想されます。空白の文字列は整数としては無効であり、解析できません。XmlSerializer同じように動作します:

using System.IO;
using System.Xml.Serialization;

static class Program {
    static void Main() {
        var obj = new XmlSerializer(typeof(Foo)).Deserialize(
            new StringReader("<Foo><TransID></TransID></Foo>"));
    }
}
public class Foo
{
    public int TransID { get; set; }
}
于 2012-11-07T23:19:07.870 に答える
0

IMOは、プロパティをNullableとして宣言する必要があります。

public int? TransID { get; set; }

これは、オブジェクトをシリアル化および逆シリアル化するときに機能させるのに十分なはずです

于 2012-11-15T16:07:03.600 に答える