【问题标题】:XML deserialization does not workXML 反序列化不起作用
【发布时间】:2012-02-09 07:27:45
【问题描述】:

我需要将 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; }
}

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

【问题讨论】:

    标签: c# .net xml xml-serialization


    【解决方案1】:

    识别此类问题的最佳方法是实际反转您的序列化逻辑。 使用与您在 XML 中的数据相匹配的数据创建对象。然后尝试对其进行序列化,使输出与您要反序列化的数据相同。

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

    如果序列化一样,也可以反序列化。

    【讨论】:

      【解决方案2】:

      因为属性错误而失败;不同之处在于XmlArrayItem 需要两级关系(&lt;Players&gt;&lt;Players&gt;&lt;Player .../&gt;...&lt;/Players&gt;&lt;/Players&gt;);因此对于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; } }
      

      (即没有set,并且是列表而不是数组)

      甚至是惰性实例化:

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

      【讨论】:

      • 请注意,列表不能命名为Players,因为类型名称相同。
      • @alexn 很好发现 - 不过我是从问题中得出的结论
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 2020-10-16
      • 2012-09-18
      • 1970-01-01
      相关资源
      最近更新 更多