我最近遇到了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反序列化器呕吐和我创建的普通反序列化器工作正常?
答案 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; }
这应该足以使它在序列化和反序列化对象时起作用