- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我的应用程序有一个设置对象,其中有两个集合。这些集合是包含属性包集合的简单列表泛型。当我序列化它时,一切都毫无问题地保存了:
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/
我的应用程序有一个设置对象,其中有两个集合。这些集合是包含属性包集合的简单列表泛型。当我序列化它时,一切都毫无问题地保存了: XmlSerializer x = new XmlSerializer(s
我在解释器中做所有这些...... loc1 = '/council/council1' file1 = open(loc1, 'r') 此时我可以执行 file1.read() 并将文件内容作为字符
我是一名优秀的程序员,十分优秀!