我的应用程序中有一个设置对象,其中包含两个集合。这些集合是简单的List泛型,包含一系列属性包。当我序列化它时,一切都保存没有问题:
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");
}
}
}
答案 0 :(得分:1)
如果列表被反序列化,则永远不会调用setter。只是吸气剂。 Deserializer只调用#Add()方法并将序列化元素添加到exising List中。这是Design的行为。请参阅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私有化。
答案 1 :(得分:0)
您可以覆盖序列化和反序列化方法以添加自定义信息。自从我实现了类似的东西以来已经有一段时间了,但我记得在收到序列化数据时必须重写以从对象重建一些私有成员。