【发布时间】:2019-03-04 13:55:45
【问题描述】:
情况:
我有一个绑定到设置视图的 ViewModel,用户应该在其中输入许多个性化设置,并且应该能够将它们保存为预设并加载它们。为此,ViewModel 包含预设数据模型的集合,这些模型本身包含不同的属性、类对象等。 计划是通过对整个 ViewModel 的 xml 序列化和反序列化来实现保存所有预设。
代码/问题
我从 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类是直接在对应View的xaml里面实例化的:
<UserControl.Resources>
<ResourceDictionary>
<vm:LinearAxisColorPresetsViewModel x:Key="vm" />
</ResourceDictionary>
</UserControl.Resources>
This posts 第二个答案表明约定是,从 XAML 调用的构造函数应该是无参数的,我想坚持这一点。
问题:
问题只是如何根据最佳实践解决这个问题。由于这是我第一次尝试序列化和反序列化,我担心我在这里有点走错路了。我的感觉是只有数据模型类应该被序列化。我的 ViewModel 拥有两个 ObservableCollection 此类类,但是我想序列化完整的集合以及 ViewModel 中的其他属性,例如所选索引。
【问题讨论】:
标签: c# .net serialization xml-serialization