【问题标题】:Deserialize generic collections - coming up empty反序列化通用集合 - 空出来
【发布时间】:2010-04-03 11:22:42
【问题描述】:

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

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

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

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

这是什么原因造成的?一切都很普通......这是设置对象中的一个sn-p......省略了大部分内容。 PresentationSourceDirectory 工作得很好,但没有命中 PresentationModules 的设置器:

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

【问题讨论】:

    标签: c# xml serialization xml-serialization


    【解决方案1】:

    如果一个列表被反序列化,setter 永远不会被调用。只是吸气剂。 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; }
    }
    

    仅当您将 NEW 列表分配给属性时,才会调用您在 PresentationModules 设置器中的事件。也许您应该将 setter 设为私有。

    【讨论】:

    • 好的,这是有道理的,但我不清楚我的选择是什么来解决这个问题。看来我必须在修改我的对象后返回并实现自定义序列化程序/de,因此它不接受集合的设置器......这是唯一的选择吗?
    • 我已经更新了我的答案。也许这就是你想要的。您在 setter 中调用的事件是必需的吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多