Десериализовать общие коллекции - пустые - PullRequest
3 голосов
/ 03 апреля 2010

У меня есть объект настроек для моего приложения, в котором есть две коллекции. Коллекции - это простые дженерики List, содержащие коллекцию пакетов свойств. Когда я его сериализую, все сохраняется без проблем:

XmlSerializer x = new XmlSerializer(settings.GetType());
TextWriter tw = new StreamWriter(@"c:\temp\settings.cpt");
x.Serialize(tw, settings);

Однако, когда я десериализую его, все восстанавливается, кроме двух коллекций (проверяется путем установки точки останова на установщиках:

XmlSerializer x = new XmlSerializer(typeof(CourseSettings));
XmlReader tr = XmlReader.Create(@"c:\temp\settings.cpt");
this.DataContext = (CourseSettings)x.Deserialize(tr);

Что бы это вызвало? Все довольно ванильно ... вот фрагмент из объекта настроек ... опуская большинство из них. PresentationSourceDirectory работает просто отлично, но установщик PresentationModules не срабатывает:

private string _presentationSourceDirectory = string.Empty;
public string PresentationSourceDirectory {
  get { return _presentationSourceDirectory; }
  set {
    if (_presentationSourceDirectory != value) {
      OnPropertyChanged("PresentationSourceDirectory");
      _presentationSourceDirectory = value;
    }
  }
}

private List<Module> _presentationModules = new List<Module>();
public List<Module> PresentationModules {
  get {
    var sortedModules = from m in _presentationModules
                        orderby m.ModuleOrder
                        select m;
    return sortedModules.ToList<Module>();
  }
  set {
    if (_presentationModules != value) {
      _presentationModules = value;
      OnPropertyChanged("PresentationModules");
    }
  }
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2010

Если список десериализован, сеттер никогда не вызывается. Просто добытчик. Deserializer просто вызывает метод #Add () и добавляет сериализованные элементы в существующий список. Это поведение по дизайну. См. MSDN.
Вы можете добавить новое свойство, которое получает ваш список без каких-либо операторов linq. Добавьте [XmlIgnore] к существующему свойству, XmlSerializer пропустит это свойство сейчас.

[XmlIgnore]
public List<Module> PresentationModules {

Создайте новое свойство, которое предоставляет список:

private List<Module> _presentationModules = new List<Module>();
public List<Module> PresentationModulesList {
  get { return _presentationModules; }
}

Ваше событие в установщике PresentationModules будет вызвано только в том случае, если вы назначите для свойства НОВЫЙ список. Может быть, вы должны сделать сеттер приватным.

0 голосов
/ 03 апреля 2010

Вы можете переопределить методы сериализации и десериализации, чтобы добавить пользовательскую информацию.Прошло некоторое время с тех пор, как я реализовал нечто подобное, но я вспоминаю о необходимости переопределить, чтобы восстановить некоторые частные члены из объекта после получения данных сериализации.

...