7

私のデータをこれにシリアル化したい:

<?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ドキュメントを出力する必要があります

4

1 に答える 1

9

これはかなり前のことですが、私は最終的に自分でそれを理解しました。

解決策は、サポートされている各派生型の[XmlElement]属性をコレクションプロパティに追加することでした。

private List<BaseCommand> _commands = new List<BaseCommand>();
[XmlElement(typeof(ExecuteCommand))]
[XmlElement(typeof(WaitCommand))]
public List<BaseCommand> Commands
{
    get
    {
        return _commands;
    }
    set
    {
        _commands = value;
    }
}
于 2012-11-08T01:10:02.573 に答える