反序列化通用集合 - 空洞

时间:2010-04-03 11:22:43

标签: c# xml serialization xml-serialization

我的应用程序中有一个设置对象,其中包含两个集合。这些集合是简单的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");
    }
  }
}

2 个答案:

答案 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)

您可以覆盖序列化和反序列化方法以添加自定义信息。自从我实现了类似的东西以来已经有一段时间了,但我记得在收到序列化数据时必须重写以从对象重建一些私有成员。