从C#对象中序列化XML,链接到那些对象

时间:2015-05-26 16:43:46

标签: c# serialization

我有一个像这样设置的容器类

[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的基础。

有些事情不对,但我不确定是什么。

1 个答案:

答案 0 :(得分:0)

[XmlInclude]属性提示XmlSerializer关于基类的继承成员,如果没有继承,则不需要使用它。

集合是自动序列化的,您可以使用[XmlArray]属性重命名外部元素。

使用[XmlArrayItem]重命名内部元素。