XmlSerializer не действует так, как мне кажется - PullRequest
0 голосов
/ 21 сентября 2009

Я использовал XmlSerializer в течение нескольких лет без каких-либо проблем. Я начал новый проект и класс, который я сделал расширенный список. Когда я пошел сериализовать данные, я потерял свойства, добавленные в мой класс. Очевидно, я могу это исправить, изменив класс, чтобы он больше не расширял список. Мне действительно было просто интересно, почему XmlSerializer игнорирует свойства в Списке.

var data = new Data { Number = 3 };
data.AddRange(Enumerable.Range(5, 5));
var serializer = new XmlSerializer(typeof(Data));
var memoryStream = new MemoryStream();
serializer.Serialize(memoryStream, data);
memoryStream.Position = 0;
var dataSerialized = new StreamReader(memoryStream).ReadToEnd();

public class Data : List<int>
{
    public int Number
    {
        get;
        set;
    }
}

После фрагмента кода выше dataSerialized выглядит следующим образом (отсутствует свойство Number):

<?xml version="1.0"?>
<ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <int>5</int>
  <int>6</int>
  <int>7</int>
  <int>8</int>
  <int>9</int>
</ArrayOfInt>

Ответы [ 2 ]

6 голосов
/ 21 сентября 2009

Это сделано специально, в основном было принято решение обрабатывать коллекции как массивы, а не как классы с элементами, поэтому коллекции будут выглядеть как массивы на проводе, поэтому они не имеют никаких элементов, кроме элементов коллекции, и могут «уплощено», добавив [XmlElement] к члену типа ICollection.

Что вы можете сделать, это реализовать IXmlSerializable и выполнить пользовательскую сериализацию, однако лично я предпочитаю способ DataContract.

1 голос
/ 21 сентября 2009

См. Принятый ответ на один из моих собственных вопросов (Не обращайте внимания на сам вопрос, поскольку он полностью не соответствует сути). XmlSerializer будет только сериализовать коллекцию Items коллекции, но не ее свойства.

...