我想指定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>

最佳答案

如果您使用的是带有默认(非XmlSerializer)序列化的IXmlSerializable,那么实际上:如果不添加一个额外的类AlertOne,带有一个属性和一个[XmlText]值,就无法实现这一点。

如果实现IXmlSerializable,则应该可行,但这不是一个健壮的实现的好接口(interface)(特别是反序列化很难;如果仅写,则应该可以)。我个人建议使用上述额外的类映射到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]直通成员。

10-06 12:47