在XML序列化中,属性可以序列化为新元素的属性吗?

时间:2013-11-21 17:15:14

标签: c# xml serialization

我有一个类似于以下结构的类:

[XmlRoot("myclass")]
public class MyClass
{
    [XmlElement("subject")]
    public string Subject { get; set; }

    [XmlElement("object")]
    public string Object { get; set; }
}

假设Subject = "Me"Object = "You",这将序列化为:

<myclass>
  <subject>Me</subject>
  <object>You</object>
</myclass>

有没有办法序列化到以下XML,最好使用XML序列化属性并避免使用新的自定义类型:

<myclass>
  <subject value="Me" />
  <object value="You" />
</myclass>

1 个答案:

答案 0 :(得分:2)

您可以通过创建使用XmlAttributeAttribute的类来完成此操作。我添加了T的隐式转换,以便您可以继续使用简洁的语法,例如new MyClass { Subject = "Me", Object = "You" }

[XmlRoot("myclass")]
public class MyClass
{
    [XmlElement("subject")]
    public ValueAttribute<string> Subject { get; set; }

    [XmlElement("object")]
    public ValueAttribute<string> Object { get; set; }
}
public class ValueAttribute<T>
{
    [XmlAttribute("value")]
    public T Value { get; set; }

    public static implicit operator ValueAttribute<T>(T value)
    {
        return new ValueAttribute<T> { Value = value };
    }
}

这会产生类似:

<?xml version="1.0" encoding="utf-16"?>
<myclass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <subject value="Me" />
  <object value="You" />
</myclass>