我有一个包含列表属性的类,其中列表包含具有枚举属性的对象。
当我序列化它时,它看起来像这样:
<?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);
}
}
}