2012-02-09 68 views
-1

我需要将XML文件反序列化为对象。 XML内容:XML反序列化不起作用

<Players dealerId="2"> 
    <Player id="1"> 
     <ScreenName>JetYeo</ScreenName> 
    </Player> 
    <Player id="2"> 
     <ScreenName>Test</ScreenName> 
    </Player> 
    </Players> 

我定义了一个对象类:

[Serializable()] 
[XmlRoot("Players")] 
public class Players 
{ 
    [XmlAttribute("dealerId")] 
    public int DealerId { get; set; } 
    [XmlArrayItem("Player", typeof(Player))] 
    public Player[] Players { get; set; } 
} 

[Serializable()] 
[XmlRoot("Player")] 
public class Player 
{ 
    [XmlAttribute("id")] 
    public int Id { get; set; } 
    [XmlElement("ScreenName")] 
    public string ScreenName { get; set; } 
} 

但是,反序列化不起作用:玩家数组为null。请帮我解决它。谢谢。

回答

3

由于属性错误而失败;区别在于XmlArrayItem需要两级关系(<Players><Players><Player .../>...</Players></Players>);因此,对于Players它应该是:

[XmlElement("Player")] 
public Player[] Players { get; set; } 

虽然就个人而言,我宁愿:

private readonly List<Player> players = new List<Player>(); 
[XmlElement("Player")] 
public List<Player> Players { get { return players; } } 

(即没有0​​,和一个列表而不是数组)

甚至懒洋洋地 - 代表:

private List<Player> players; 
[XmlElement("Player")] 
public List<Player> Players { 
    get { return players ?? (players = new List<Player>()); } 
} 
+0

请注意,该列表不能命名'Players',因为该类型命名相同。 – alexn 2012-02-09 07:36:10

+0

@alexn well spotted - 我正在考虑这个问题,虽然 – 2012-02-09 07:40:02

+0

只注意到:) – alexn 2012-02-09 07:40:39

4

识别这种问题是实际上颠倒你的序列化逻辑。 使用与XML中的数据相匹配的数据创建对象。然后尝试序列化它,以便输出与您想要反序列化的数据相同。

这样,您实际上可以“看到”可用属性的效果,您可以将其应用于属性。

如果它序列化相同,也可以反序列化它。