Ситуация:
У меня есть ViewModel, привязанная к представлению настроек, где пользователь должен вводить множество персонализированных настроек и должен иметь возможность сохранять их как предустановки изагрузить их.Для этого ViewModel содержит коллекции предустановленных моделей данных, которые сами содержат различные свойства, объекты классов и так далее.План состоит в том, чтобы добиться сохранения всех предустановок путем сериализации xml и десериализации всей модели ViewModels.
Код / Проблема
Из конструктора ViewModel я вызываю следующий метод:
private void InitializePresetsFromFile()
{
if (!File.Exists(Info.GetDefaultColorPalettePresetsXml()))
{
SetupNewEmpty();
SerializePresets(Info.GetDefaultColorPalettePresetsXml());
}
else
{
DeserializePresets(Info.GetDefaultColorPalettePresetsXml());
}
}
Итак, метод проверяет, является ли методфайл, содержащий пресет, существует - если этого не происходит, он должен установить пустой пресет и сохранить его во вновь созданном файле, в противном случае он должен загрузить пресет из существующего файла.
Процесс сериализации работает нормально, однако, поскольку я сериализуюсь в this
, существует проблема с десериализацией:
private void DeserializePresets(string path)
{
XmlSerializer deserializer = new XmlSerializer(typeof(LinearAxisColorPresetsViewModel));
TextReader reader = new StreamReader(path);
object obj = deserializer.Deserialize(reader);
LinearAxisColorPresetsViewModel XmlData = (LinearAxisColorPresetsViewModel)obj;
reader.Close();
VolumePresetList = XmlData.VolumePresetList;
WaveShapePresetList = XmlData.WaveShapePresetList;
VolumePresetSelectedIndex = XmlData.VolumePresetSelectedIndex;
WaveShapePresetSelectedIndex = XmlData.WaveShapePresetSelectedIndex;
}
Проблема в том, что, поскольку я вызываю метод InitializePresetsFromFile()
непосредственно из конструктора, десериализатор вызывает себя в бесконечном цикле, что приводит к ошибке переполнения стека.
Итак, самое простое решение - использовать другой конструктор с параметром, где я называю InitializePresetsFromFile()
, верно?Проблема здесь в том, что класс ViewModel непосредственно создается в xaml соответствующего View:
<UserControl.Resources>
<ResourceDictionary>
<vm:LinearAxisColorPresetsViewModel x:Key="vm" />
</ResourceDictionary>
</UserControl.Resources>
В этом посте второй ответ гласит, что соглашение состоит в том, что конструкторы, вызываемые из XAML, должны бытьбез параметров, и я хочу придерживаться этого.
Вопрос:
Вопрос заключается в том, как решить эту проблему в соответствии с передовой практикой.Так как это моя первая попытка сериализации и десериализации, я боюсь, что я немного на неверном пути.Мне кажется, что только классы модели данных должны быть сериализованы.Моя ViewModel содержит две ObservableCollection таких классов, однако я хочу сериализовать полные коллекции, а также другие свойства в ViewModel, такие как выбранный индекс.