Ситуация:
У меня есть 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, такие как выбранный индекс.