我正在使用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