2011-12-21 91 views
1

比方说,我有这个虚构的XML:XML反序列化到不同的类名称

<Schedule> 
    <Month name="March"> 
    <Day name="Monday" /> 
    </Month> 
    <Month name="April"> 
    <Day name="Tuesday" /> 
    <Day name="Monday" /> 
    </Month> 
</Schedule> 

我想反序列化上面。不过,我想使用不同的类层次结构反序列化此xml,因为类Schedule,Month和Day在其他地方使用。

因此,例如,我想有这些类:

[XmlRoot("Schedule") 
public class ParserSchedule 
{ 
    [XmlElement("Month")] 
    public List<ParserMonth> Month{ get; set; } 
} 

public class ParserMonth 
{ 
    [XmlAttribute("name")] 
    public string Name{ get; set; } 

    [XmlElement("Day")] 
    public List<ParserDay> Day{ get; set; } 
} 

public class ParserDay 
{ 
    [XmlAttribute("name")] 
    public string Name{ get; set; }   
} 

然而,这是行不通的。我收到异常说Day不能被序列化,因为它没有默认的公共构造函数。我猜这是因为它试图创建Day类的实例而不是ParserDay类。

无论如何要做到这一点?

+0

你在问题中省略了ParsedDay中的构造函数还是没有?你有上课吗?你能发布确切的错误信息吗? – 2011-12-21 14:01:54

+0

如果你省略了构造函数,那么.NET在默认情况下生成一个无参数的空构造函数...... – 2011-12-21 14:10:01

+0

请不要将C#放在标题中。这就是标签的用途。 – Amy 2011-12-22 01:40:47

回答

2

你可以试试吗?

[XmlRoot("Schedule")] 
public class ParserSchedule 
{ 
    [XmlElement("ParserMonth")] 
    public ParserMonth[] Months { get; set; } 
} 

public class ParserMonth 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 

    [XmlElement("ParserDay")] 
    public ParserDay[] Days { get; set; } 
} 

public class ParserDay 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
} 
4

这对我来说工作得很好。您必须有其他问题或没有正确/完全粘贴您的代码。

void Main() 
{ 
    var ser = new XmlSerializer(typeof(ParserSchedule)); 
    var xml = @"<Schedule> 
    <Month name=""March""> 
    <Day name=""Monday"" /> 
    </Month> 
    <Month name=""April""> 
    <Day name=""Tuesday"" /> 
    <Day name=""Monday"" /> 
    </Month> 
</Schedule>"; 

    using (var reader = new StringReader(xml)) 
    { 
     var schedule = (ParserSchedule)ser.Deserialize(reader); 
     schedule.Dump(); // LINQPad method to dump object to debug 
    } 
} 

[XmlRoot("Schedule")] 
public class ParserSchedule 
{ 
    [XmlElement("Month")] 
    public List<ParserMonth> Month{ get; set; } 
} 

public class ParserMonth 
{ 
    [XmlAttribute("name")] 
    public string Name{ get; set; } 

    [XmlElement("Day")] 
    public List<ParserDay> Day{ get; set; } 
} 

public class ParserDay 
{ 
    [XmlAttribute("name")] 
    public string Name{ get; set; }   
} 

public class Day 
{ 
    private Day() {} // new Day() should fail to compile 
} 

编码样式注意:你真的应该打电话给你的成员,返回集合类型为复数public List<ParserDay> Days{ get; set; }以避免混淆。

相关问题