代码之家  ›  专栏  ›  技术社区  ›  Andrew Connell

反序列化泛型集合-将为空

  •  3
  • Andrew Connell  · 技术社区  · 15 年前

    我的应用程序有一个设置对象,其中有两个集合。集合是包含属性包集合的简单列表泛型。当我序列化它时,所有的内容都会被保存,没有问题:

    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 回复  |  直到 15 年前
        1
  •  1
  •   chriszero    15 年前

    如果列表被反序列化,则永远不会调用setter。只是个好消息。反序列化程序只调用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中的事件。也许你应该让塞特人保密。

        2
  •  0
  •   gsiener    15 年前

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