c # xml сериализация пользовательского elementName - PullRequest
4 голосов
/ 02 января 2012

Я пытаюсь сериализовать объект класса в XML, который выглядит следующим образом:

<Colors>
<Blue>
  <R>0,000</R>
  <G>0,000</G>
  <B>1,000</B>
  <A>1,000</A>
</Blue>
<Red>
  <R>1,000</R>
  <G>0,000</G>
  <B>0,000</B>
  <A>1,000</A>
</Red></Colors>

Важной частью является то, что синий и красный цвета не указываются напрямую. У меня есть такой класс:

public class Color
{
    [XmlElement("R")]
    public string red;

    [XmlElement("G")]
    public string green;

    [XmlElement("B")]
    public string blue;

    [XmlElement("A")]
    public string alpha;
}

Мне нужен способ создания экземпляров объекта класса Color и сериализации их с разными именами, такими как blue, red, green, anothercolor1, anothercolor2, ... также должно быть возможным динамическое добавление новых цветов во время работы программы.

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

Есть идеи?

1 Ответ

0 голосов
/ 02 января 2012

Лучше всего было бы использовать отражение, чтобы получить все свойства класса Color и просмотреть их:

public void SerializeAllColors()
{
    Type colorType = typeof(System.Drawing.Color);
    PropertyInfo[] properties = colorType.GetProperties(BindingFlags.Public | BindingFlags.Static);
    foreach (PropertyInfo p in properties)
    {
        string name = p.Name;
        Color c = p.GetGetMethod().Invoke(null, null);

        //do your serialization with name and color here
    }
}

Редактировать: Если вы не можете контролироватьизмените формат XML, и вы знаете, что формат не изменится, вы можете дополнительно жестко закодировать сериализацию самостоятельно:

Вне цикла foreach:

string file = "<Colors>\n";

Внутри цикла:

file += "\t<" + name + ">\n";
file += "\t\t<R>" + color.R.ToString() + "</R>\n";
file += "\t\t<G>" + color.G.ToString() + "</G>\n";
file += "\t\t<B>" + color.B.ToString() + "</B>\n";
file += "\t\t<A>" + color.A.ToString() + "</A>\n";
file += "\t</" + name + ">\n";

И в самом конце:

file += "</Colors>"
using (StreamWriter writer = new StreamWriter(@"colors.xml"))
{
    writer.Write(file);
}

Замените \n на \r\n или Environment.NewLine, если хотите

...