【问题标题】:How to specify one property is attribute of another In C# XML serialization?如何在 C# XML 序列化中指定一个属性是另一个属性的属性?
【发布时间】:2011-10-11 07:20:51
【问题描述】:

我想指定 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”项目的两个属性,这是一个警报。大概其他警报也有类似的功能?

标签: c# xml serialization xml-serialization


【解决方案1】:

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

如果你实现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] pass-thru 成员。

【讨论】:

  • 谢谢,这和我想的差不多。
猜你喜欢
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多