2012-07-20 65 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