gpt4 book ai didi

c# - 反序列化通用集合 - 空着

转载 作者:数据小太阳 更新时间:2023-10-29 02:43:10 25 4
gpt4 key购买 nike

我的应用程序有一个设置对象,其中有两个集合。这些集合是包含属性包集合的简单列表泛型。当我序列化它时,一切都毫无问题地保存了:

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

然而,当我反序列化它时,除了两个集合之外的所有东西都被恢复了(通过在 setter 上设置断点来验证:

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

什么会导致这种情况?一切都很普通……这里是设置对象的一个​​片段……省略了大部分。 PresentationSourceDirectory 工作正常,但 PresentationModules 的 setter 未命中:

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");
}
}
}

最佳答案

如果列表被反序列化,则永远不会调用 setter。只是 setter/getter 。 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 的 setter 中的事件只有在您将新列表分配给属性时才会被调用。也许您应该将 setter 设为私有(private)。

关于c# - 反序列化通用集合 - 空着,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2571093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com