XML 对象的反序列化 returns 空对象

Deserialization of XML object returns empty object

我正在尝试用 C# 实现 Ally Accounts API 的一部分。我 运行 遇到了特定端点的问题。

我想获取特定账户的余额:

  [XmlRoot("accountbalance")]
  public class SummaryAccountBalance : Balance
  {
    [XmlElement("buyingpower")]
    public BuyingPower BuyingPower { get; set; }

    [XmlElement("fedcall")]
    public decimal FedCall { get; set; }

    [XmlElement("housecall")]
    public decimal HouseCall { get; set; }

    [XmlElement("money")]
    public AccountMoney Money { get; set; }

    [XmlElement("securities")]
    public Securities Securities { get; set; }
  }

其中 Balance 是一个简单的抽象 class:

  public abstract class Balance
  {
    [XmlElement("account")]
    public int Account { get; set; }

    [XmlElement("accountvalue")]
    public decimal AccountValue { get; set; }
  }

对于其他端点,这工作得很好,我能够使用此结构获取摘要帐户余额信息,例如在 this 端点中。

但是 /accounts/xxxxxxx/balances.xml 不想为我工作。鉴于此文件:

<?xml version="1.0" encoding="UTF-8"?>
<response id="77cf30da:12df25c7074:-7ea6">
  <accountbalance>
    <account>12345678</account>
    <accountvalue>67119.41</accountvalue>
    <buyingpower>
      <cashavailableforwithdrawal>66177.48000000001</cashavailableforwithdrawal>
      <daytrading>264709.84</daytrading>
      <equitypercentage>100</equitypercentage>
      <options>66177.48000000001</options>
      <soddaytrading>264709.84</soddaytrading>
      <sodoptions>66177.48000000001</sodoptions>
      <sodstock>132354.96000000002</sodstock>
      <stock>132354.96000000002</stock>
    </buyingpower>
    <fedcall>0.0</fedcall>
    <housecall>0.0</housecall>
    <money>
      <accruedinterest>0.0</accruedinterest>
      <cash>66134.67</cash>
      <cashavailable>0.0</cashavailable>
      <marginbalance>0.0</marginbalance>
      <mmf>0.02</mmf>
      <total>66134.69</total>
      <uncleareddeposits>0.0</uncleareddeposits>
      <unsettledfunds>0.0</unsettledfunds>
      <yield>0.0</yield>
    </money>
    <securities>
      <longoptions>0.0</longoptions>
      <longstocks>57.39</longstocks>
      <options>0.0</options>
      <shortoptions>0.0</shortoptions>
      <shortstocks>0.0</shortstocks>
      <stocks>57.39</stocks>
      <total>984.72</total>
    </securities>
  </accountbalance>
</response>

以下代码检测到它确实是一个 SummaryAccountBalance 但未能填充字段:

 var serializer = new XmlSerializer(typeof(SummaryAccountBalance), new XmlRootAttribute("response"));
  return (SummaryAccountBalance)serializer.Deserialize(summaryAccountBalance);

其中summaryAccountBalance是上面文件的字节流版本。

我不确定这里哪里出了问题,我正在努力解决它。即使逐行执行代码,在这个反序列化步骤之前似乎也没有任何问题。更重要的是,这个确切的对象在其他端点中使用,并且这些端点实现可以毫无问题地反序列化它。

我缺少什么来完成这项工作?

What am I missing to make this work?

您缺少的是 <response> 而不是 您的 SummaryAccountBalance。这是嵌套的 <accountbalance> 元素。

你需要再声明一个class来描述整个XML:

[XmlRoot("response")]
public class SummaryAccountBalanceResponse
{
    [XmlAttribute("id")]
    public string Id { get; set; }

    [XmlElement("accountbalance")]
    public SummaryAccountBalance Balance { get; set; }
}

并反序列化为 class:

var serializer = new XmlSerializer(typeof(SummaryAccountBalanceResponse));
return ((SummaryAccountBalanceResponse)serializer.Deserialize(summaryAccountBalance)).Balance;