Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自StringReader的XML反序列化崩溃_C#_Xml_Deserialization - Fatal编程技术网

C# 来自StringReader的XML反序列化崩溃

C# 来自StringReader的XML反序列化崩溃,c#,xml,deserialization,C#,Xml,Deserialization,我正在尝试构建一个非常简单的C应用程序来下载最新的卢布-美元汇率。www.cbr.ru提供了一个web服务来从中提取信息。我首先调用函数获取最新的汇率日期。然后使用datetime调用以获取特定日期的汇率 我能够提取汇率XML并通过StringReader显示它。我使用粘贴的XML作为类来创建一个使用此XML的类。在进行编码时,它似乎在工作,因为我的rates变量会自动建议预期的属性,即rates.Vname、rates.Vcode等。。。但是,该程序崩溃了通用Windows错误消息-NewEx

我正在尝试构建一个非常简单的C应用程序来下载最新的卢布-美元汇率。www.cbr.ru提供了一个web服务来从中提取信息。我首先调用函数获取最新的汇率日期。然后使用datetime调用以获取特定日期的汇率

我能够提取汇率XML并通过StringReader显示它。我使用粘贴的XML作为类来创建一个使用此XML的类。在进行编码时,它似乎在工作,因为我的rates变量会自动建议预期的属性,即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的一个示例,还包括许多其他速率,您可以调用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;
}

程序崩溃不是一个足够具体的问题描述。请看,我们对您问题中的类没有任何概念,例如什么是ValuedDataValuetCursonDate,任何其他神奇的方法?抱歉,伙计们,让我详细说明一下:崩溃只是因为NewExchangeRateService停止工作了。您想发送更多有关此问题的信息吗?我将用我的类的代码块进行编辑以解释ValuedDataValuetCursonDate你不认为反序列化中必须使用的类是ValuedData吗?新的XmlSerializertypeof ValuedData;我想你是对的。这似乎在某种意义上也起作用,即我键入代码时的建议看起来与预期一样,但程序仍在反序列化阶段崩溃。谢谢。事实证明,这更多的是对StringReader的误解,而不是对XmlSerializer的误解。