WSDL生成的代码未正确反序列化XML中的long
本文关键字:反序列化 XML 中的 long 代码 WSDL | 更新日期: 2023-09-27 18:29:58
我们的一家供应商给了我一个WSDL,其中包含以下内容:
<xsd:element name="RegistrationResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="DateTimeStamp" type="xsd:dateTime" nillable="true"/>
<xsd:element name="EchoData" type="xsd:string" nillable="true"/>
<xsd:element name="TransactionTrace" type="xsd:long" nillable="true"/>
<xsd:element name="ResponseCode" type="xsd:int" nillable="true"/>
<xsd:element name="ResponseMessage" type="xsd:string" nillable="true"/>
<xsd:element name="ClientAccNumber" type="xsd:long" nillable="true"/>
<xsd:element name="BranchCode" type="xsd:int" nillable="true"/>
<xsd:element name="HIN" type="xsd:long" nillable="true"/>
<xsd:element name="EasyPayRef" type="xsd:long" nillable="true"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
然而,有时我从他们那里得到的回复不会包含所有字段。例如,在这种情况下:
<soapenv:Body>
<tpw:RegistrationResponse>
<DateTimeStamp>
2012-04-02T19:10:41.4430564Z
</DateTimeStamp>
<EchoData/>
<TransactionTrace>
5418721751027669946
</TransactionTrace>
<ResponseCode>
25
</ResponseCode>
<ResponseMessage>
Invalid Mobile Account Type
</ResponseMessage>
<ClientAccNumber/>
<BranchCode/>
<HIN>
0
</HIN>
<EasyPayRef/>
</tpw:RegistrationResponse>
</soapenv:Body>
现在,Visual Studio中的代码在添加服务引用时生成的代码不喜欢ClientAccNumber为空的事实。生成的代码如下所示:
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://tpwebservice.x.com", Order=5)]
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
public System.Nullable<long> ClientAccNumber;
当它试图反序列化从服务器接收的响应时,我收到一个"输入格式不正确"异常。我想的是,它看到一个空白字符串,并试图解析其中的一个长字符串,但显然失败了。我尝试将minOccurs="0"添加到wsdl中,但没有帮助。
如何修复wsdl或生成的代码来解决这个问题?或者我还缺少什么?
我会更改代码,将属性定义为字符串,并具有一个不可XML序列化的属性,该属性具有转换为字符串的实际Nullable<long>
值:
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://tpwebservice.x.com", Order=5)]
[System.Xml.Serialization.XmlElementAttribute("ClientAccNumber", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
public string ClientAccNumberStr;
[System.Xml.Serialization.XmlIgnoreAttribute]
public System.Nullable<long> ClientAccNumber {
get {
if (string.IsNullOrEmpty(ClientAccNumberStr))
return null;
return long.Parse(ClientAccNumberStr);
}
set {
if (!value.HasValue) {
ClientAccNumberStr = null;
} else {
ClientAccNumberStr = value.Value.ToString();
}
}
}