如何在C# XML序列化中指定一个属性是另一个属性的属性?

6
我想说明在一个可XML序列化的类中,一个属性是另一个属性的属性,而不是该类本身的属性。是否可能在不创建其他类的情况下实现这一点?
例如,如果我有以下C#类:
class Alerts
{
  [XmlElement("AlertOne")]
  public int AlertOneParameter { get; set; }

  public bool IsAlertOneEnabled { get; set; }
}

我该如何指定IsAlertOneEnabled是AlertOne的一个属性,以便XML序列化为以下内容?

<Alerts>
  <AlertOne Enabled="True">99</AlertOne>
</Alerts>

就信息而言,个人认为从设计角度来看,将参数/启用拆分为它们自己的类型是有意义的(忘记XML)-它们显然是“AlertOne”项的两个属性,这是一个警报。其他警报可能具有类似的功能? - Marc Gravell
1个回答

5
如果您正在使用默认(非IXmlSerializable)序列化的XmlSerializer,那么确实:如果没有添加一个额外的类,该类包含一个属性和一个[XmlText]值,是无法实现此操作的,该额外的类即为AlertOne
如果您实现了IXmlSerializable,这应该是可能的,但这不是一个易于稳健实现的好接口(特别是反序列化很困难;如果它是只写的,那么这应该没问题)。我个人建议使用带有上述额外类的DTO模型进行映射。
当然,像LINQ-to-XML这样的其他工具可以使其变得非常简单,但工作方式不同。
以下是可行的DTO布局示例:
public class Alerts
{
    [XmlElement("AlertOne")]
    public Alert AlertOne { get; set; }
}
public class Alert
{
    [XmlText]
    public int Parameter { get; set; }
    [XmlAttribute("Enabled")]
    public bool Enabled { get; set; }
}

当然可以添加一些[XmlIgnore]的成员,这些成员可与内部实例进行通信。


谢谢,这基本上是我想的。 - Steve Crane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接