Как указать одно свойство является атрибутом другого в C # XML-сериализации? - PullRequest
6 голосов
/ 11 октября 2011

Я хочу указать, что одно свойство в сериализуемом классе 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>

1 Ответ

5 голосов
/ 11 октября 2011

Если вы используете XmlSerializer с сериализацией по умолчанию (не IXmlSerializable), тогда действительно: этого нельзя достичь без добавления дополнительного класса, который равен AlertOne, с атрибутом и [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] проходных членов, которые общаются с внутренним экземпляром.

...