WPF C#使用XmlSerializer反序列化一个可观察集合<string>添加额外的项</string>

时间:2013-05-15 08:38:31

标签: c# wpf serialization initialization xmlserializer

我希望保存并加载一个包含ObservableCollection<string>的类(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但是如果文件不包含列表(例如,保存文件的先前版本),如果我删除初始化并且保存的文件中没有列表,列表中没有项目。这是不可接受的:

是否有正确的方法在构造函数中加载带有初始化的可观察集合而不会出现重复项?

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

1 个答案:

答案 0 :(得分:1)

  

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

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

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

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

那就是说,我并不是太喜欢初始化方法,因为它们缺乏可见性而开发人员可能会忘记调用它们。作为替代方案,您可以使用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;
    }
}

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