Десериализовать массивы int из файла XML - PullRequest
5 голосов
/ 18 апреля 2011

Я пишу проект AC # и пытаюсь десериализовать объект, имеющий поле типа int [], и хочу выполнить десериализацию другим способом.

Скажем, у меня есть класс:

class Player
{
   public string Name;
   public int[] Spells;
}

И xml-файл, из которого я десериализую экземпляр класса Player:

<Player>
  <Name>John</Name>
  <Spells>
    <int>1</int>
    <int>5</int>
    <int>9</int>
  </Spells>
</Player>

Дело в том, что я не хочу, чтобы xml-файл выглядел так, я хочуэто будет больше похоже на это:

<Player>
  <Name>John</Name>
  <Spells>1 5 9</Spells>
</Player>

Я использую XmlSerializer, и он только десериализует поле Spells только при чтении формы сначала xml.Интересно, можно ли десериализовать массив int так же, как простое поле?

Ответы [ 3 ]

7 голосов
/ 18 апреля 2011

Одним из способов может быть создание другого свойства, которое будет принимать разделенный пробелами набор для целей сериализации. Например,

class Player
{
   public string Name;

   [XmlIgnore]
   public int[] Spells;

   [XmlElement("Spells")
   public string SpellsString
   {
     get
     {
        // array to space delimited string
     }
     set
     {
       // string to array conversion
     }
   }
}
2 голосов
/ 18 апреля 2011
class Player
{
   public string Name { get; set; }
   public string SpellData { get; set; }

   public int[] Spells() {
        return SpellData.Split(" ").select(n=>int.parse(n)).ToArray();
   };
}

Нечто подобное заставит ваши XML-данные выглядеть так, как вы хотите, так как для строки, а не для функции, будет выполнено сериализацию. Но почему вас волнует, как выглядит ваш xml? Другой XML намного чище.

1 голос
/ 18 апреля 2011

Если вы храните заклинания в строке с пробелами в XML, вы можете использовать следующий код для преобразования его в список целых чисел:

var spellsAsIntegers = 
spellsAsString.Split(' ').Select(n => int.Parse(n)).ToList();
...