使用XmlSerializer拒绝某些IList变量和自定义get属性的意外行为

时间:2017-03-08 16:15:53

标签: c# xml serialization deserialization

我正在使用XmlSerializer来序列化一个类的对象List,这些对象也有一些List对象。

public class Configuration
{
    private IList<Project> _projects = null;
    public IList<Project> Projects
    {
        get
        {
            return new List<Project>(_projects);
        }

        set
        {
            _projects = value;

        }
    }

    public void Load()
    {
        //Here takes place the deserialization
    }

    public void Save()
    {
        //Here takes place the serialization
    }
}

public class Project
{
    public string Name { get; set; }

    private IList<Document> _documents = null;
    public IList<Document> Documents
    {
        get
        {
            return new List<Document>(_documents);
        }

        set
        {
            _documents = value;

        }
    }

    private IList<Test> _tests = null;
    public IList<Test> Tests
    {
        get
        {
            return new List<Test>(_tests);
        }

        set
        {
            _tests = value;

        }
    }
}

此实现不会在运行时抛出有关接口类型的Document或Tests变量的异常(IList,这似乎是Projects的一个问题)。如果我将文档和测试更改为列表,则异常消失,但出现另一个问题(不相关)。序列化不会序列化Documents and Tests数组(因此反序列化无法恢复这些变量)。如果我更改两个属性的自定义get实现,直接返回_documents和_tests,它们都按预期工作。但同样,Projects属性也有一个自定义get实现,它按预期工作。

public class Configuration
{
    private IList<Project> _projects = null;
    public IList<Project> Projects
    {
        get
        {
            return new List<Project>(_projects);
        }

        set
        {
            _projects = value;

        }
    }

    public void Load()
    {
        //Here takes place the deserialization
    }

    public void Save()
    {
        //Here takes place the serialization
    }
}

public class Project
{
    public string Name { get; set; }

    public List<Document> Documents { get; set; }
    public List<Test> Tests { get; set; }
}

当然我可以忍受这个,但我怀疑我可能做错了什么。首先,我认为没有理由将序列化项目作为IList而不是文档或测试。其次,我没有看到为什么自定义gettter for Projects有效,但是它阻止了文档和测试的正确序列化。

我也试过使用DataContractSerializer,它开箱即用,但我更喜欢XmlSerializer更清晰的xml输出。

任何提示?

P.S。:完整的实施和测试的完整VS 2015解决方案可以通过以下链接下载:https://www.dropbox.com/s/38cp12rgi2o4pqw/SerializationTest.zip?dl=0

0 个答案:

没有答案