StringReader的XML反序列化崩溃

时间:2014-12-05 21:26:04

标签: c# xml deserialization

我正在尝试构建一个非常简单的C#应用​​程序来下载最新的RUB-USD汇率。 www.cbr.ru提供了一个从中提取信息的Web服务。我首先调用函数来获取最新的汇率日期。然后使用该日期时间进行调用以获得特定日期的汇率。

我能够提取汇率XML并通过StringReader显示它。我使用Pasted XML作为Classes来使用此XML创建一个类。在进行编码时,它似乎正在工作,因为我的速率变量自动提取预期的属性,即rates.Vname,rates.Vcode等...但程序崩溃(通用Windows错误消息 - “NewExchangeRateService已停止工作”)当它进入反序列化步骤。

这就是我所拥有的,有些线条只是我流程的一部分,显然可以忽略......

public Form1()
{
    InitializeComponent();

    CBR.ru.DailyInfoSoapClient rublesClient = new DailyInfoSoapClient();
    DateTime lastRUB = rublesClient.GetLatestDateTime();
    MessageBox.Show(lastRUB.ToShortDateString());
    var RubRateXml = rublesClient.GetCursOnDateXML(lastRUB);
    DataSet RUBrate = rublesClient.GetCursOnDate(lastRUB);
    StringReader sr = new StringReader(RUBrate.GetXml());
    richTextBox1.Text = sr.ReadToEnd();
    XmlSerializer xs = new XmlSerializer(typeof (ValuteDataValuteCursOnDate));
    var rates = (ValuteDataValuteCursOnDate) xs.Deserialize(sr);
    MessageBox.Show(rates.Vname);
}

XML看起来像:

<ValuteData>
  <ValuteCursOnDate>
    <Vname>Доллар США</Vname>                                                                                                                                                                                                                                              
    <Vnom>1</Vnom>
    <Vcurs>53.1088</Vcurs>
    <Vcode>840</Vcode>
    <VchCode>USD</VchCode>
  </ValuteCursOnDate>
</ValuteData>

这将生成以下类:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class ValuteData
{

    private ValuteDataValuteCursOnDate[] valuteCursOnDateField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("ValuteCursOnDate")]
    public ValuteDataValuteCursOnDate[] ValuteCursOnDate
    {
        get { return this.valuteCursOnDateField; }
        set { this.valuteCursOnDateField = value; }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ValuteDataValuteCursOnDate
{

    private string vnameField;

    private ushort vnomField;

    private decimal vcursField;

    private ushort vcodeField;

    private string vchCodeField;

    /// <remarks/>
    public string Vname
    {
        get { return this.vnameField; }
        set { this.vnameField = value; }
    }

    /// <remarks/>
    public ushort Vnom
    {
        get { return this.vnomField; }
        set { this.vnomField = value; }
    }

    /// <remarks/>
    public decimal Vcurs
    {
        get { return this.vcursField; }
        set { this.vcursField = value; }
    }

    /// <remarks/>
    public ushort Vcode
    {
        get { return this.vcodeField; }
        set { this.vcodeField = value; }
    }

    /// <remarks/>
    public string VchCode
    {
        get { return this.vchCodeField; }
        set { this.vchCodeField = value; }
    }
}

我确信这非常简单,我只是对使用反序列化的某个地方产生了误解,所以希望有人可以快速帮助我。如果你想更进一步,我接下来将需要弄清楚如何拉出Vcurs,其中VchCode = USD(这只是XML的一个示例,还包括许多其他费率)

1 个答案:

答案 0 :(得分:2)

您致电ReadToEnd,然后尝试从同一StringReader反序列化。但是你已经阅读了整个读者。

另外,你应该尝试这样的事情:

public Form1()
{
    InitializeComponent();
}

public void LoadData()
{

    CBR.ru.DailyInfoSoapClient rublesClient = new DailyInfoSoapClient();
    DateTime lastRUB = rublesClient.GetLatestDateTime();
    // MessageBox.Show(lastRUB.ToShortDateString());
    var RubRateXml = rublesClient.GetCursOnDateXML(lastRUB);
    DataSet RUBrate = rublesClient.GetCursOnDate(lastRUB);
    string xml = RUBrate.GetXml();
    ValuteDataValuteCursOnDate rates;
    using (StringReader sr = new StringReader(xml))
    {
        XmlSerializer xs = new XmlSerializer(typeof (ValuteDataValuteCursOnDate));
        rates = (ValuteDataValuteCursOnDate) xs.Deserialize(sr);
    }
    richTextBox1.Text = xml;
    // MessageBox.Show(rates.Vname);
}

var form = new Form1();
try
{
    form.LoadData();
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
    throw;
}