我有以下XML:
<Vehicle>
<Type>
<ISN>213123214</ISN>
<Name>ddsd</Name>
</Type>
<RegNo>1234</RegNo>
<Mark>
<ISN>423434234</ISN>
<Name>asdasd</Name>
</Mark>
<Model>
<ISN>434234324324</ISN>
<Name>asddsa</Name>
</Model>
<EstimatedPrice>
<Amount>15000</Amount>
<AmountPrev />
<Currency>
<Code>R</Code>
<Name>RU</Name>
</Currency>
</EstimatedPrice>
</Vehicle>
好吧,我正在尝试使用C#将其反序列化到目标对象。 这是我的目标类:
public class Vehicle {
[XmlElement("Type")]
public Type Type { get; set; }
[XmlElement("Mark")]
public Mark Brand { get; set; }
[XmlElement("Model")]
public Mark Brand { get; set; }
[XmlElement("EstimatedPrice")]
public Estimation Estimation { get; set; }
}
问题是如何正确反序列化标记,模型和类型?现在我得到空对象而不是数据。我试图将“Vehicle”指定为此子类的根标记,但它没有效果。
P.S。类Mark,Model和Type派生自基类:
[Serializable]
public class ResponseItem
{
[XmlElement("ISN")]
string ISN { get; set; }
[XmlElement("Name")]
string Name { get; set; }
}
对于反序列化我正在使用XmlSerializer类。所有带子标签或带有唯一名称的子标签的标签都会正确反序列化。
我错过了什么?
感谢。
答案 0 :(得分:1)
ResponseItem
基类中的属性必须是公开的
public class ResponseItem
{
[XmlElement("ISN")]
public string ISN { get; set; }
[XmlElement("Name")]
public string Name { get; set; }
}
XML序列化程序不会处理非公共属性
答案 1 :(得分:0)
我喜欢向后工作并创建一个测试序列化程序来验证我的结构。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
Vehicle vehicle = new Vehicle() {
Type = new Type()
{
ISN = "213123214",
Name = "ddsd"
},
RegNo = 1234,
Brand = new Mark()
{
ISN = "423434234",
Name = "asdasd"
},
Model = new Mark()
{
ISN = "434234324324",
Name = "asddsa"
},
estimation = new Estimation()
{
Amount = 15000,
AmountPrev = null,
currency = new Currency()
{
Code = "R",
Name = "RU"
}
}
};
XmlSerializer serializer = new XmlSerializer(typeof(Vehicle));
StreamWriter writer = new StreamWriter(FILENAME);
serializer.Serialize(writer, vehicle);
writer.Flush();
writer.Close();
writer.Dispose();
}
}
[XmlRoot("Vehicle")]
public class Vehicle
{
[XmlElement("Type")]
public Type Type { get; set; }
[XmlElement("Mark")]
public Mark Brand { get; set; }
[XmlElement("Model")]
public Mark Model { get; set; }
[XmlElement("RegNo")]
public int RegNo { get; set; }
[XmlElement("EstimatedPrice")]
public Estimation estimation { get; set; }
}
[XmlRoot("EstimationPrice")]
public class Estimation
{
[XmlElement("Amount")]
public int Amount { get; set; }
[XmlElement("AmountPrev")]
public int? AmountPrev { get; set; }
[XmlElement("Currency")]
public Currency currency { get; set; }
}
[XmlRoot("Currency")]
public class Currency
{
[XmlElement("Code")]
public string Code { get; set; }
[XmlElement("Name")]
public string Name { get; set; }
}
[XmlRoot("Type")]
public class Type : ResponseItem
{
}
[XmlRoot("Mark")]
public class Mark : ResponseItem
{
}
[XmlRoot("ResponseItem")]
public class ResponseItem
{
[XmlElement("ISN")]
public string ISN { get; set; }
[XmlElement("Name")]
public string Name { get; set; }
}
}