Десериализация ObservableCollection

356
08 января 2017, 15:59

Есть такой класс с коллекцией:

public class Animal
{
    public string Sound { get; set; }
}
[Serializable]
public class Example
{
    public ObservableCollection<Animal> animals { get; set; } = new ObservableCollection<Animal>()
    {
        new Animal() {Sound = "Гав"},
        new Animal() {Sound = "Мяу"},
        new Animal() {Sound = "Кря"}
    };
    public Example()
    {
    }
}

Сериализую в XML и все проходит нормально. Файл выглядит так:

<?xml version="1.0"?>
<Example xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <animals>
    <Animal>
      <Sound>Гав</Sound>
    </Animal>
    <Animal>
      <Sound>Мяу</Sound>
    </Animal>
    <Animal>
      <Sound>Кря</Sound>
    </Animal>
  </animals>
</Example>

Но после десериализации в коллекции находятся 6 элементов, вместо 3-х. Как я понимаю это происходит из-за того, что при создании экземпляра класса в коллекцию добавляются изначальные 3 элемента благодаря конструктору, а затем добавляются еще 3 при десериализации.

Как сделать, чтобы после десериализации в коллекции не было ничего лишнего?

Answer 1

Есть решение в лоб:

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

Может быть есть еще какие-то интересные решения, но эти самые быстрые в реализации.

READ ALSO
Обновление привязки интерфейса

Обновление привязки интерфейса

В программе есть кнопка по нажатию которой пользователь может сбросить значения всех настроек к значению по умолчаниюНастройки хранятся...

318
Как написать свою кнопку

Как написать свою кнопку

Подскажите как нарисовать точную кнопку взял из сайта: Ссылка на кнопку

351
В чем разница между XPathNavigator и XmlDocument?

В чем разница между XPathNavigator и XmlDocument?

В чем разница между XPathNavigator и XmlDocument?

405
LINQ to XML в С#

LINQ to XML в С#

Есть некий анонимный массив типов:

381