2012-07-20 31 views
7

想我的数据序列化到这一点:如何将XML序列化多态数组没有包装元素

<?xml version="1.0" encoding="ibm850"?> 
<Batch Name="Test batch"> 
    <ExecuteCommand Command="..." /> 
    <WaitCommand Seconds="5" /> 
</Batch> 

但相反我得到这个(请注意包装命令元素)

<?xml version="1.0" encoding="ibm850"?> 
<Batch Name="Test batch"> 
    <Commands><!-- I want to get rid of thiw wrapper Commands element and just --> 
    <ExecuteCommand Command="..." /> 
    <WaitCommand Seconds="5" /> 
    </Commands> 
</Batch> 

这里的用于产生此示例代码:

public class BaseCommand //base class 
{ 
    [XmlAttribute] 
    public string Result { get; set; } 
} 

public class ExecuteCommand : BaseCommand 
{ 
    [XmlAttribute] 
    public string Command { get; set; } 
} 

public class WaitCommand : BaseCommand 
{ 
    [XmlAttribute] 
    public int Seconds { get; set; } 
} 

public class Batch 
{ 
    [XmlAttribute] 
    public string Name { get; set; } 

    private List<BaseCommand> _commands = new List<BaseCommand>(); 
    [XmlArrayItem(typeof(ExecuteCommand))] 
    [XmlArrayItem(typeof(WaitCommand))] 
    public List<BaseCommand> Commands 
    { 
     get 
     { 
      return _commands; 
     } 
     set 
     { 
      _commands = value; 
     } 
    } 

    public static void Main() 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Batch)); 

     Batch b = new Batch(); 
     b.Name = "Test batch"; 
     b.Commands.Add(new ExecuteCommand() { Command = "..." }); 
     b.Commands.Add(new WaitCommand() { Seconds = 5 }); 

     serializer.Serialize(Console.Out, b); 
     Console.Read(); 
    } 
} 

我搜索并阅读了关于此主题的文章堆。它们似乎都提供了使用单一类类型序列化集合的解决方案(不使用继承)。我使用继承,似乎没有任何工作。不幸的是,由于传统支持,我必须输出精确的XML文档。

回答

8

这是相当一段时间以前,但我最终还是自己想出了它。

的解决方案是为每个支持的派生类型添加[的XmlElement]属性的集合属性

private List<BaseCommand> _commands = new List<BaseCommand>(); 
[XmlElement(typeof(ExecuteCommand))] 
[XmlElement(typeof(WaitCommand))] 
public List<BaseCommand> Commands 
{ 
    get 
    { 
     return _commands; 
    } 
    set 
    { 
     _commands = value; 
    } 
} 
+0

好找...... – GONeale 2013-09-04 04:03:11