U
umhlali
I get the following exception when my VB.NET app calls a Java web service that returns an array of objects. The same call works for a single object though. So looks like there is no problem serializing the object but there seems to be a problem serializing an array of objects. Any help will be appreciated
"Cannot assign object of type System.Object[] to an object of type ElectronicWallet.C2PTest.PaymentItem."
[System.InvalidOperationException]: {System.InvalidOperationException
HelpLink: Nothin
InnerException: {System.InvalidCastException
Message: "There is an error in XML document (12, 19).
Source: "System.Xml
StackTrace: " at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters
at ElectronicWallet.C2PTest.SOAPPaymentServiceService.method1(String par1, String par2, String par3, Int64 par4, String par5, String par6, Boolean par7, String par8, String par9, String par10, String par11) in C:\Projects\Gateway\ElectronicWallet\ElectronicWalletWebService\Web References\C2PTest\Reference.vb:line 4
at ElectronicWallet.PayoutCommon.DoPayout(Int64 lngTransID, XmlDocument& oWSReq, XmlDocument& oWSResp) in C:\Projects\Gateway\ElectronicWallet\ElectronicWalletWebService\PayoutCommon.vb:line 22
at ElectronicWallet.Process.EWPayout(String s_Payout) in C:\Projects\Gateway\ElectronicWallet\ElectronicWalletWebService\Process.asmx.vb:line 153
TargetSite: {System.Reflection.RuntimeMethodInfo
?ex.InnerException
{System.InvalidCastException
[System.InvalidCastException]: {System.InvalidCastException
HelpLink: Nothin
InnerException: Nothin
Message: "Cannot assign object of type System.Object[] to an object of type ElectronicWallet.C2PTest.PaymentItem[].
Source: "fqsomxwu
StackTrace: " at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read3_ResponsePar6l(
at System.Xml.Serialization.XmlSerializationReader.ReadReferencingElement(String name, String ns, Boolean elementCanBeType, String& fixupReference
at System.Xml.Serialization.XmlSerializationReader.ReadReferencedElements(
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read6_method1Response()
TargetSite: {System.Reflection.RuntimeMethodInfo
Related code from .NET proxy class............................
'<remarks/
<System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace:="http://somewebsite", ResponseNamespace:="https://somewebsite/method1")>
Public Function method1(ByVal par1 As String, ByVal par2 As String, ByVal par3 As String, ByVal par4 As Long, ByVal par5 As String, ByVal par6 As String, ByVal par7 As Boolean, ByVal par8 As String, ByVal par9 As String, ByVal par10 As String, ByVal par11 As String) As <System.Xml.Serialization.SoapElementAttribute("method1Return")> ResponseMode
Dim results() As Object = Me.Invoke("method1", New Object() {par1, par2, par3,_u97 ?mount, par5, par6, par7, par8, par9, par10, par11}
Return CType(results(0),ResponseModel
End Functio
'<remarks/
<System.Xml.Serialization.SoapTypeAttribute("ResponseModel", "http://somewebsite")>
Public Class ResponseMode
'<remarks/
Public ret1 As Strin
'<remarks/
Public ret2 As Strin
'<remarks/
Public ret 3 As Strin
'<remarks/
Public paymentItems() As PaymentIte
End Clas
'<remarks/
<System.Xml.Serialization.SoapTypeAttribute("PaymentItem", "http://somewebsite")>
Public Class PaymentIte
'<remarks/
Public ret4 As Strin
'<remarks/
Public ret5 As Strin
'<remarks/>
Public ret6 As String
End Class
Here is the VB.NET code.............................
Dim SoapRequest As New C2PTest.SOAPPaymentServiceService
Dim C2PResult As New C2PTest.ResponseModel
Dim Dict As New Collections.Specialized.StringDictionary
C2PResult = SoapRequest.method1(Dict("par1"), Dict("par2"), Dict("par3"), Dict("par4"), _
Dict("par5"), Dict("Par6"), Dict("par7"), Dict("par8"), Dict("par9"), _
Dict("par10"), Dict("par11"))
Here is the WSDL file.............................
<wsdl:definitions targetNamespace="https://somewebsite/method1" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="https://somewebsite/method1" xmlns:intf="https://somewebsite/method1" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://somewebsite" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<schema targetNamespace="http://somewebsite" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="PaymentItem">
<sequence>
<element name="ret4" nillable="true" type="xsd:string"/>
<element name="ret5" nillable="true" type="xsd:string"/>
<element name="ret6" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ResponseModel">
<sequence>
<element name="ret1" nillable="true" type="xsd:string"/>
<element name="ret2" nillable="true" type="xsd:string"/>
<element name="ret3" nillable="true" type="xsd:string"/>
<element name="paymentItems" nillable="true" type="impl:ArrayOf_tns1_PaymentItem"/>
</sequence>
</complexType>
</schema>
<schema targetNamespace="https://somewebsite/method1" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="ArrayOf_tns1_PaymentItem">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="tns1aymentItem[]"/>
</restriction>
</complexContent>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="method1Request">
<wsdlart name="par1" type="xsd:string"/>
<wsdlart name="par2" type="xsd:string"/>
<wsdlart name="par3" type="xsd:string"/>
<wsdlart name="par4" type="xsd:long"/>
<wsdlart name="par5" type="xsd:string"/>
<wsdlart name="par6" type="xsd:string"/>
<wsdlart name="par7" type="xsd:boolean"/>
<wsdlart name="par8" type="xsd:string"/>
<wsdlart name="par9" type="xsd:string"/>
<wsdlart name="par10" type="xsd:string"/>
<wsdlart name="par11" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="method1Response">
<wsdlart name="method1Return" type="tns1:ResponseModel"/>
</wsdl:message>
<wsdlortType name="SOAPPaymentService">
<wsdlperation name="method1" parameterOrder="par1 par2 par3 par4 par5 par6 par7 par8 par9 par10 par11">
<wsdl:input message="impl:method1Request" name="method1Request"/>
<wsdlutput message="impl:method1Response" name="method1Response"/>
</wsdlperation>
</wsdlortType>
<wsdl:binding name="method1SoapBinding" type="impl:SOAPPaymentService">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdlperation name="method1">
<wsdlsoapperation soapAction=""/>
<wsdl:input name="method1Request">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://somewebsite" use="encoded"/>
</wsdl:input>
<wsdlutput name="method1Response">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://somewebsite/method1" use="encoded"/>
</wsdlutput>
</wsdlperation>
</wsdl:binding>
<wsdl:service name="SOAPPaymentServiceService">
<wsdlort binding="impl:method1SoapBinding" name="method1">
<wsdlsoap:address location="https://somewebsite/method1"/>
</wsdlort>
</wsdl:service>
</wsdl:definitions>
"Cannot assign object of type System.Object[] to an object of type ElectronicWallet.C2PTest.PaymentItem."
[System.InvalidOperationException]: {System.InvalidOperationException
HelpLink: Nothin
InnerException: {System.InvalidCastException
Message: "There is an error in XML document (12, 19).
Source: "System.Xml
StackTrace: " at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters
at ElectronicWallet.C2PTest.SOAPPaymentServiceService.method1(String par1, String par2, String par3, Int64 par4, String par5, String par6, Boolean par7, String par8, String par9, String par10, String par11) in C:\Projects\Gateway\ElectronicWallet\ElectronicWalletWebService\Web References\C2PTest\Reference.vb:line 4
at ElectronicWallet.PayoutCommon.DoPayout(Int64 lngTransID, XmlDocument& oWSReq, XmlDocument& oWSResp) in C:\Projects\Gateway\ElectronicWallet\ElectronicWalletWebService\PayoutCommon.vb:line 22
at ElectronicWallet.Process.EWPayout(String s_Payout) in C:\Projects\Gateway\ElectronicWallet\ElectronicWalletWebService\Process.asmx.vb:line 153
TargetSite: {System.Reflection.RuntimeMethodInfo
?ex.InnerException
{System.InvalidCastException
[System.InvalidCastException]: {System.InvalidCastException
HelpLink: Nothin
InnerException: Nothin
Message: "Cannot assign object of type System.Object[] to an object of type ElectronicWallet.C2PTest.PaymentItem[].
Source: "fqsomxwu
StackTrace: " at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read3_ResponsePar6l(
at System.Xml.Serialization.XmlSerializationReader.ReadReferencingElement(String name, String ns, Boolean elementCanBeType, String& fixupReference
at System.Xml.Serialization.XmlSerializationReader.ReadReferencedElements(
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read6_method1Response()
TargetSite: {System.Reflection.RuntimeMethodInfo
Related code from .NET proxy class............................
'<remarks/
<System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace:="http://somewebsite", ResponseNamespace:="https://somewebsite/method1")>
Public Function method1(ByVal par1 As String, ByVal par2 As String, ByVal par3 As String, ByVal par4 As Long, ByVal par5 As String, ByVal par6 As String, ByVal par7 As Boolean, ByVal par8 As String, ByVal par9 As String, ByVal par10 As String, ByVal par11 As String) As <System.Xml.Serialization.SoapElementAttribute("method1Return")> ResponseMode
Dim results() As Object = Me.Invoke("method1", New Object() {par1, par2, par3,_u97 ?mount, par5, par6, par7, par8, par9, par10, par11}
Return CType(results(0),ResponseModel
End Functio
'<remarks/
<System.Xml.Serialization.SoapTypeAttribute("ResponseModel", "http://somewebsite")>
Public Class ResponseMode
'<remarks/
Public ret1 As Strin
'<remarks/
Public ret2 As Strin
'<remarks/
Public ret 3 As Strin
'<remarks/
Public paymentItems() As PaymentIte
End Clas
'<remarks/
<System.Xml.Serialization.SoapTypeAttribute("PaymentItem", "http://somewebsite")>
Public Class PaymentIte
'<remarks/
Public ret4 As Strin
'<remarks/
Public ret5 As Strin
'<remarks/>
Public ret6 As String
End Class
Here is the VB.NET code.............................
Dim SoapRequest As New C2PTest.SOAPPaymentServiceService
Dim C2PResult As New C2PTest.ResponseModel
Dim Dict As New Collections.Specialized.StringDictionary
C2PResult = SoapRequest.method1(Dict("par1"), Dict("par2"), Dict("par3"), Dict("par4"), _
Dict("par5"), Dict("Par6"), Dict("par7"), Dict("par8"), Dict("par9"), _
Dict("par10"), Dict("par11"))
Here is the WSDL file.............................
<wsdl:definitions targetNamespace="https://somewebsite/method1" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="https://somewebsite/method1" xmlns:intf="https://somewebsite/method1" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://somewebsite" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<schema targetNamespace="http://somewebsite" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="PaymentItem">
<sequence>
<element name="ret4" nillable="true" type="xsd:string"/>
<element name="ret5" nillable="true" type="xsd:string"/>
<element name="ret6" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ResponseModel">
<sequence>
<element name="ret1" nillable="true" type="xsd:string"/>
<element name="ret2" nillable="true" type="xsd:string"/>
<element name="ret3" nillable="true" type="xsd:string"/>
<element name="paymentItems" nillable="true" type="impl:ArrayOf_tns1_PaymentItem"/>
</sequence>
</complexType>
</schema>
<schema targetNamespace="https://somewebsite/method1" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="ArrayOf_tns1_PaymentItem">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="tns1aymentItem[]"/>
</restriction>
</complexContent>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="method1Request">
<wsdlart name="par1" type="xsd:string"/>
<wsdlart name="par2" type="xsd:string"/>
<wsdlart name="par3" type="xsd:string"/>
<wsdlart name="par4" type="xsd:long"/>
<wsdlart name="par5" type="xsd:string"/>
<wsdlart name="par6" type="xsd:string"/>
<wsdlart name="par7" type="xsd:boolean"/>
<wsdlart name="par8" type="xsd:string"/>
<wsdlart name="par9" type="xsd:string"/>
<wsdlart name="par10" type="xsd:string"/>
<wsdlart name="par11" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="method1Response">
<wsdlart name="method1Return" type="tns1:ResponseModel"/>
</wsdl:message>
<wsdlortType name="SOAPPaymentService">
<wsdlperation name="method1" parameterOrder="par1 par2 par3 par4 par5 par6 par7 par8 par9 par10 par11">
<wsdl:input message="impl:method1Request" name="method1Request"/>
<wsdlutput message="impl:method1Response" name="method1Response"/>
</wsdlperation>
</wsdlortType>
<wsdl:binding name="method1SoapBinding" type="impl:SOAPPaymentService">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdlperation name="method1">
<wsdlsoapperation soapAction=""/>
<wsdl:input name="method1Request">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://somewebsite" use="encoded"/>
</wsdl:input>
<wsdlutput name="method1Response">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://somewebsite/method1" use="encoded"/>
</wsdlutput>
</wsdlperation>
</wsdl:binding>
<wsdl:service name="SOAPPaymentServiceService">
<wsdlort binding="impl:method1SoapBinding" name="method1">
<wsdlsoap:address location="https://somewebsite/method1"/>
</wsdlort>
</wsdl:service>
</wsdl:definitions>