我有一个像这样设置的容器类
[XmlRoot("Root")]
[XmlInclude(typeof(class1))]
[XmlInclude(typeof(class2))]
public class Root
{
public string id {get;set;}
public class1 Class1 {get;set;}
public List<class2> Classes2 {get;set;}
}
[XmlType("class1")]
public class1
{
public string foo {get;set;}
public int bar {get;set;}
}
[XmlType("class2")]
[XmlInclude(typeof(class3)]
{
public double fred {get;set;}
public bool mode {get;set;}
public class3 Class3 {get;set;}
}
[XmlType("class3")]
{
public int singular {get;set;}
}
(实际名称并不重要,重点在于从根,其他人干了)。
当我尝试使用XmlSerializer序列化文件时,我得到的是根,但不是分支。
我的XmlSerializer看起来像这样
try
{
bgWorker.DoWork += (object sender, DoWorkEventArgs e) =>
{
var jobr = TechApp2.Singleton.DBManager.GetSingleObject<Root>("id", id);
var emptyNs = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
var filename = Path.Combine(TechApp2.Singleton.ContentDirectory, typeof(Root).ToString() + "-" + id + ".xml");
var serializer = new XmlSerializer(typeof(Root));
serializer.Serialize(File.Create(filename), jobr, emptyNs);
};
bgWorker.RunWorkerAsync();
}
catch (Exception ex)
{
bgWorker.CancelAsync();
Console.WriteLine("Exception thrown - {0}:{1}", ex.Message, ex.InnerException);
}
没什么可惊天动地的。
如果我查看调试器中的jobr对象,那么来自root的子节点就可以观察到,但是序列化的对象只是root的基础。
有些事情不对,但我不确定是什么。
答案 0 :(得分:0)
[XmlInclude]属性提示XmlSerializer关于基类的继承成员,如果没有继承,则不需要使用它。
集合是自动序列化的,您可以使用[XmlArray]属性重命名外部元素。
使用[XmlArrayItem]重命名内部元素。