如何使用不同的标记名称但相同的子标记反序列化XML?

时间:2015-12-10 14:47:52

标签: c# xml deserialization xmlserializer

我有以下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类。所有带子标签或带有唯一名称的子标签的标签都会正确反序列化。

我错过了什么?

感谢。

2 个答案:

答案 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; }
    }
}
​