C# 来自StringReader的XML反序列化崩溃
我正在尝试构建一个非常简单的C应用程序来下载最新的卢布-美元汇率。www.cbr.ru提供了一个web服务来从中提取信息。我首先调用函数获取最新的汇率日期。然后使用datetime调用以获取特定日期的汇率 我能够提取汇率XML并通过StringReader显示它。我使用粘贴的XML作为类来创建一个使用此XML的类。在进行编码时,它似乎在工作,因为我的rates变量会自动建议预期的属性,即rates.Vname、rates.Vcode等。。。但是,该程序崩溃了通用Windows错误消息-NewExchangeRateService在进入反序列化步骤时已停止工作 这是我得到的,有些行只是我流程的一部分,显然可以忽略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
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的误解。