リストプロパティを含むクラスがあり、リストには列挙型プロパティを持つオブジェクトが含まれています。
これをシリアル化すると、次のようになります。
<?xml version="1.0" encoding="ibm850"?>
<test>
<events>
<test-event type="changing" />
<test-event type="changed" />
</events>
</test>
属性などを通じて、Xml を次のようにすることは可能ですか?
<?xml version="1.0" encoding="ibm850"?>
<test>
<events>
<changing />
<changed />
</events>
</test>
基本的に、タグ名を決定する方法として列挙型のプロパティ値を使用しますか? クラス階層を使用する (つまり、プロパティ値を使用する代わりにサブクラスを作成する) 唯一の方法ですか?
編集:テスト後、クラス階層でさえ実際には機能しないようです。サブクラスであっても、必要な出力を得るためにクラスを構造化する方法があれば、それも受け入れられる答えです。
上記の Xml を出力するサンプル プログラムを次に示します (Visual Studio で実行するには、Ctrl キーを押しながら F5 キーを押すことを忘れないでください。そうしないと、プログラム ウィンドウがすぐに閉じます)。
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
namespace ConsoleApplication18
{
public enum TestEventTypes
{
[XmlEnum("changing")]
Changing,
[XmlEnum("changed")]
Changed
}
[XmlType("test-event")]
public class TestEvent
{
[XmlAttribute("type")]
public TestEventTypes Type { get; set; }
}
[XmlType("test")]
public class Test
{
private List<TestEvent> _Events = new List<TestEvent>();
[XmlArray("events")]
public List<TestEvent> Events { get { return _Events; } }
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
test.Events.Add(new TestEvent { Type = TestEventTypes.Changing });
test.Events.Add(new TestEvent { Type = TestEventTypes.Changed });
XmlSerializer serializer = new XmlSerializer(typeof(Test));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
serializer.Serialize(Console.Out, test, ns);
}
}
}