【问题标题】:WPF C# Deserialize an observable collection <string> with XmlSerializer adds extra itemsWPF C# 使用 XmlSerializer 反序列化一个可观察的集合 <string> 添加额外的项目
【发布时间】:2013-05-15 08:38:30
【问题描述】:

我希望保存并加载一个包含 ObservableCollection&lt;string&gt; 的类 (MeasConSettings) 问题是列表在我的构造函数中初始化,所以当我执行以下操作时:

XmlSerializer serializer = new XmlSerializer(typeof(MeasConSettings));

创建了一个包含项目 1 2 3 4 的列表。它可以很好地保存所有内容,但在加载方面却出错了:

MeasConSettings loadedSettings = (MeasConSettings)serializer.Deserialize(stream);

它从初始化列表开始并添加加载的列表项而不是覆盖它们,因此结果是一个包含项目 1 2 3 4 1 2 3 4 的列表。

显然,解决方案是从构造函数中删除初始化,如本主题所示:Deserializing List with XmlSerializer Causing Extra Items 但如果文件不包含列表(例如保存文件的以前版本),如果我删除初始化并且保存的文件中没有列表,列表中将没有项目。这是不可接受的,所以:

有没有合适的方法来加载一个在构造函数中初始化的 observable 集合,而不会出现重复项?

是否有正确的方法来检查保存的文件是否包含某些参数?

【问题讨论】:

    标签: c# wpf serialization initialization xmlserializer


    【解决方案1】:

    如果我删除初始化并且保存的文件中没有列表,则列表中将没有项目。这是不可接受的

    然后在初始化中处理这个特殊情况。

    public void Init()
    {
        if (this.List == null)
        {
            // Initialize the list
        }
    }
    

    从那里,您只需在每次创建 MeasConSettings 对象时调用 Init 方法(通过调用构造函数或使用反序列化器)。

    也就是说,我并不太喜欢初始化方法,因为它们缺乏可见性,而且开发人员可能会忘记调用它们。作为替代方案,您可以使用 getter:

    private List<int> list;
    
    public List<int> List
    {
        get
        {
            if (this.list == null)
            {
                this.list = new List<int> { 1, 2, 3, 4 };
            }
    
            return this.list;
        }
    
        set
        {
            this.list = value;
        }
    }
    

    注意:此代码不是线程安全的。

    【讨论】:

      猜你喜欢
      • 2012-03-24
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多