从链接到这些对象的C#对象序列化XML

从链接到这些对象的C#对象序列化XML,c#,serialization,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")]

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

[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;}
}
 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);
        }
[XmlRoot(“根”)]
[xmlclude(typeof(class1))]
[xmlclude(typeof(class2))]
公共类根
{
公共字符串id{get;set;}
公共类1{get;set;}
公共列表类2{get;set;}
}
[XmlType(“class1”)]
公共一级
{
公共字符串foo{get;set;}
公共整型条{get;set;}
}
[XmlType(“class2”)]
[xmlclude(typeof(class3)]
{
公共双fred{get;set;}
公共布尔模式{get;set;}
公共类3类3{get;set;}
}
[XmlType(“class3”)]
{
公共int单数{get;set;}
}
(真正的名字并不重要,关键是其他名字都是从根开始的)

当我尝试使用XmlSerializer序列化文件时,我得到的是根,而不是分支

我的XmlSerializer如下所示

[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;}
}
 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);
        }
试试看
{
bgWorker.DoWork+=(对象发送方,DoWorkEventArgs e)=>
{
var jobr=TechApp2.Singleton.DBManager.GetSingleObject(“id”,id);
var emptyNs=新的XmlSerializerNamespaces(新[]{XmlQualifiedName.Empty});
var filename=Path.Combine(TechApp2.Singleton.ContentDirectory,typeof(Root).ToString()+“-”+id+“.xml”);
var serializer=新的XmlSerializer(typeof(Root));
serializer.Serialize(File.Create(filename)、jobr、emptyNs);
};
bgWorker.RunWorkerAsync();
}
捕获(例外情况除外)
{
bgWorker.CancelAsync();
WriteLine(“抛出的异常-{0}:{1}”,例如Message,例如InnerException);
}
没有什么惊天动地的

如果我在调试器中查看jobr对象,root中的子对象就在那里并且可以观察到,但是序列化的对象只是root的基本部分


有些地方不正确,但我不确定是什么。

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

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

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