Десериализация XML не работает - PullRequest
0 голосов
/ 09 февраля 2012

Мне нужно десериализовать файл 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 имеет значение null.Пожалуйста, помогите мне решить это.Спасибо.

Ответы [ 2 ]

6 голосов
/ 09 февраля 2012

Лучший способ выявить проблемы такого рода - это изменить логику сериализации.Создайте объект с данными, которые соответствуют данным, которые вы имеете в своем XML.Затем попытайтесь сериализовать его так, чтобы выходные данные совпадали с данными, которые вы хотели бы десериализовать.

Таким образом, вы действительно можете «увидеть» влияние доступных атрибутов, которые можно применить к свойствам.

Если он сериализует то же самое, вы также можете десериализовать его.

3 голосов
/ 09 февраля 2012

Сбой из-за неправильных атрибутов; разница в том, что 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; } }

(т. Е. Нет set и список вместо массива)

или даже ленивый экземпляр:

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