【问题标题】:Error casting soap XML to BankData type将 soap XML 转换为 BankData 类型时出错
【发布时间】:2014-11-05 04:56:58
【问题描述】:

刚开始调查 Yodlee 肥皂示例,我遇到了问题

无法将“System.Xml.XmlNode[]”类型的对象转换为“BankData”类型。

DisplayBankData 类中的错误。我已经尝试从 2014Q3WSDLs 的 wdsl 定义中下载和创建 Yodlee dll,以及使用下载附带的 DLL,但没有成功。 CardData 类(可能还有其他类)也发生了同样的问题

是我遗漏了什么还是提供的 wsdl 定义有问题?

【问题讨论】:

    标签: yodlee


    【解决方案1】:

    在花了很多时间试图弄清楚这里发生了什么之后,我终于发现 Yodlee 生成的 WDSL 文件或 WSDL.exe 解释 WSDL 文件的方式有问题。

    它的实际原因是因为 WSDL 似乎没有指示 ItemData1.Accounts 下返回什么类型,这是因为它可以是 BankData 或 CardData,因为 VisualStudio 不知道期望什么类型,它 de-将对象序列化为 XML 节点。

    我设法解决这个问题的方法是,当您使用 WSDL.exe 生成 yodleeProxies.vb 文件时,您需要进入生成的文件,然后找到 ItemData1 类的定义

    Partial Public Class ItemData1
    

    你需要改变

     Public Property accounts As Object()
    

    Public Property accounts As BankData()
    

    然后它知道该对象将是 BankData 类型

    我还添加了一个需要 CardData 的新属性,以便 CardData 将出现在该属性下,并且会正确反序列化

    Public Property accounts2 As CardData()
        Get
            Return Me.accountsField
        End Get
        Set(value As CardData())
            Me.accountsField = value
        End Set
    End Property
    

    这就是我如何解决这个问题的技巧,如果其他人找到了一种更优雅的解决方法,请告诉我。

    【讨论】:

      【解决方案2】:

      我发现将下面的 XmlInclude() 属性添加到提到的代理文件glyn johnston 中的 ItemData1 类可以解决问题 - 显然,反序列化器在反序列化该属性时不知道考虑 ItemAccountData 及其后代。

      我认为“accounts”应该保存为一个对象数组,因为有几种类型从 ItemAccountData 继承,包括 CardData、BankData 等,并且在直接检查 WSDL 时,“accounts”似乎被定义为“List” 'anyType' 类型。

      有可能以这种方式定义以允许将来添加更新的类型而不会导致反序列化问题,因此基本上您需要检查数组中的每个元素并单独确定其类型,忽略您不知道的类型知道或关心。

      ...
      [System.Xml.Serialization.XmlInclude(typeof(ItemAccountData))]
      public partial class ItemData1 {
      ...
      

      我认为问题的根源是 Xml 反序列化器不考虑通过其方法签名、属性等与 ItemData1 类的定义没有某种关联的类型,并且 XmlInclude() 是要使用的属性解决这个问题。

      【讨论】:

        猜你喜欢
        • 2020-02-27
        • 1970-01-01
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多