C# 如何将包含各种对象集合的对象序列化/反序列化为XML?

C# 如何将包含各种对象集合的对象序列化/反序列化为XML?,c#,xml,serialization,collections,C#,Xml,Serialization,Collections,我想序列化一个基本上是其他项容器的类。这些项是各种对象,但它们都从一个公共类继承。用这个例子会更清楚 我有以下代码: [可序列化] [xmlclude(typeof(FileTask))] [xmlclude(typeof(DbTask))] [XmlRoot(“任务”)] 公共抽象类任务库 { [XmlAttribute(“名称”)] 公共字符串名称{get;set;} 公共任务库() { Name=“任务”; } } [可序列化] [XmlRoot(“文件任务”)] 公共类FileTask:

我想序列化一个基本上是其他项容器的类。这些项是各种对象,但它们都从一个公共类继承。用这个例子会更清楚

我有以下代码:

[可序列化]
[xmlclude(typeof(FileTask))]
[xmlclude(typeof(DbTask))]
[XmlRoot(“任务”)]
公共抽象类任务库
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
公共任务库()
{
Name=“任务”;
}
}
[可序列化]
[XmlRoot(“文件任务”)]
公共类FileTask:TaskBase
{
公共文件任务()
{
Name=“文件任务”;
}
}
[可序列化]
[XmlRoot(“dbTask”)]
公共类DbTask:TaskBase
{
公共DbTask()
{
Name=“Db任务”;
}
}
[可序列化]
[XmlRoot(“任务”)]
公共类任务配置:列表
{
}
当我用以下代码将其序列化为XML时:

var config=new TasksConfig();
config.Add(newfiletask());
config.Add(newfiletask());
config.Add(newdbtask());
config.Add(newfiletask());
config.Add(newdbtask());
SerializationHelper.SaveToXml(配置,“milos.xml”);
使用此帮助器类:

public类SerializationHelper
{
静态公共void SaveToXml(T obj,字符串文件)
{
XmlSerializerNamespaces ns=新的XmlSerializerNamespaces();
加上(“,”);
XmlSerializer serializer=新的XmlSerializer(typeof(T));
使用(TextWriter TextWriter=新StreamWriter(文件))
{
serializer.Serialize(textWriter、obj、ns);
}
}
}
我得到这个结果:


但是,我想得到这个结果:



那么我该怎么做呢?

您没有发布您的
任务配置
类源代码

这样做:

public class TaskConfig() 
{
    public TaskConfig()
    {
       this.Items = new List<TaskBase>();
    }

    [XmlArray]
    [XmlArrayItem(ElementName="FileTask", Type=typeof(FileTask))]
    [XmlArrayItem(ElementName="DbTask", Type=typeof(DbTask))]
    public List<TaskBase> Items
    {
       get;
       set;
    }
}
static void Main(string[] args)
{
    var config = new TasksConfig();
    config.Items.Add( new FileTask() { /* properties */ });
    config.Items.Add( new DbTask() { /* properties */ });

    XmlSerializer serializer = new XmlSerializer(typeof(TasksConfig));
    MemoryStream memoryStream = new MemoryStream();
    serializer.Serialize(memoryStream, config);

    System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
    String serializedString = enc.GetString(memoryStream.ToArray());
}

另一个变体是像这样的change
TaskConfig

[Serializable]
[XmlRoot("tasks")]
public class TasksConfig
{
    [XmlElement(typeof(DbTask)), XmlElement(typeof(FileTask))]
    public List<TaskBase> list = new List<TaskBase>();

    public void Add(TaskBase item){
        list.Add(item);
    }

}
[可序列化]
[XmlRoot(“任务”)]
公共类任务配置
{
[xmlement(typeof(DbTask)),xmlement(typeof(FileTask))]
公共列表=新列表();
公共作废添加(TaskBase项){
列表。添加(项目);
}
}