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项){
列表。添加(项目);
}
}