XmlSerializer: сериализация свойства класса как атрибута настраиваемого подэлемента

Я использую XmlSerializer . Мой класс:

[Serializable]
[XmlRoot(ElementName="MyClass")]
public class MyClass
{
    public string Value;
}

Я хотел бы сериализовать его так, чтобы Value заканчивалось как атрибут подэлемента с именем (например) «Текст».

Желаемый результат:

<MyClass>
    <Text Value="3"/>
</MyClass>

Но НЕ (что будет результатом маркировки Value как XmlAttribute )

<MyClass Value="3">
</MyClass>

И НЕ (что будет быть результатом маркировки Value как XmlElement ):

<MyClass>
    <Value>3</Value>
</MyClass>

Как мне этого добиться?

Я знаю, что могу изменить тип Value со строки на другой сериализуемый настраиваемый класс.

К сожалению, у меня много таких свойств, поэтому мне нужно было создать десятки крошечных классов.

Есть ли более быстрое решение?


РЕДАКТИРОВАТЬ:

В ответ на ваши комментарии:

  • Нет, не каждое свойство нужно сериализовать в подэлемент с именем «Текст». Название «Субэлемент» уникально и однозначно.

  • Пример выходного XML:

     
     
     <компаратор visible = "no" />
     
      бла-бла-бла 
    <видимость>
    
  • Пример класса:

!

[XmlRoot(ElementName="Visibility")]
public class Visibility
{
    [XPath("/site@visible")] // if only this was possible!
    public string OnSite
    {
        get { return SiteVisible ? "yes" : "no"; }
    }

    [XPath("/comparator@visible")] // as above...
    public string InComparator
    {
        get { return ComparatorVisible ? "yes" : "no"; }
    }

    [XmlIgnore]
    public bool SiteVisible;
    [XmlIgnore]
    public bool ComparatorVisible;

    [XPath("/expiration@days")] // as above...
    public int ExpiresAfterDays; 

    [XmlElement("comment")] // this is easy
    public string Comment;
}
5
задан Konrad Morawski 6 February 2012 в 12:39
поделиться