反序列化缺少的整数时,不同的.NET XML序列化程序行为

时间:2012-11-07 22:58:35

标签: .net soap xml-serialization xmlserializer

我最近遇到了SOAP Web服务的问题,其中WSDL为特定字段指定了一个整数,但XML带有一个空元素,导致.NET反序列化逻辑抛出FormatException。

WSDL看起来像这样:

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

SOAP看起来像这样:

<TransID></TransID>

这会在解析响应时导致异常。我正在谈论的服务器属于供应商,所以我没有选择更改它。我在短期内通过将字段重新定义为字符串来解决这个问题。

我的问题是:在尝试诊断此问题时,我将XML拉出到一个文件中并创建了自己的XmlSerializer,以使用WSDL导入生成的POCO来测试反序列化。我创建的XmlSerializer很好地解析了这个XML,并按预期生成父类型。没有例外。字段值为零,这是预期的。为什么SOAP反序列化器呕吐和我创建的普通反序列化器工作正常?

2 个答案:

答案 0 :(得分: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; }
}

答案 1 :(得分:0)

IMO你应该将你的财产声明为Nullable:

public int? TransID { get; set; }

这应该足以使它在序列化和反序列化对象时起作用