Объекты System.Drawing.Color, по-видимому, не будут сериализованы с помощью XmlSerializer. Каков наилучший способ для сериализации цветов xml?
Лучшее решение для XmlSerializer и System.Drawing.Color
Ответ 1
Простейший метод использует это в своем сердце:
String HtmlColor = System.Drawing.ColorTranslator.ToHtml(MyColorInstance);
Он просто преобразует любой цвет в стандартную шестнадцатеричную строку, используемую HTML, которая также легко десериализуется с помощью:
Color MyColor = System.Drawing.ColorTranslator.FromHtml(MyColorString);
Таким образом, вы просто работаете со стандартными строками болота...
Ответ 2
Окончательная рабочая версия:
Color clrGrid = Color.FromArgb(0, 0, 0);
[XmlIgnore]
public Color ClrGrid
{
get { return clrGrid; }
set { clrGrid = value; }
}
[XmlElement("ClrGrid")]
public string ClrGridHtml
{
get { return ColorTranslator.ToHtml(clrGrid); }
set { ClrGrid = ColorTranslator.FromHtml(value); }
}
Ответ 3
Мы используем это:
[Serializable]
public struct ColorEx
{
private Color m_color;
public ColorEx(Color color)
{
m_color = color;
}
[XmlIgnore]
public Color Color
{ get { return m_color; } set { m_color = value; } }
[XmlAttribute]
public string ColorHtml
{
get { return ColorTranslator.ToHtml(this.Color); }
set { this.Color = ColorTranslator.FromHtml(value); } }
public static implicit operator Color(ColorEx colorEx)
{
return colorEx.Color;
}
public static implicit operator ColorEx(Color color)
{
return new ColorEx(color);
}
}
Ответ 4
Вы можете написать простой класс-оболочку для Color, который отображает значения ARGB в качестве свойств. Вы можете переводить в/из цветов с использованием конверсий ARGB (см. docs). Что-то вроде:
[Serializable]
public class ColorWrapper
{
private Color color;
public ColorWrapper (Color color)
{
this.color = color;
}
public ColorWrapper()
{
// default constructor for serialization
}
public int Argb
{
get
{
return color.ToARGB();
}
set
{
color = Color.FromARGB();
}
}
}
Возможно, нужен и аксессор для цвета!
Преимущество этого в том, что класс может использоваться во всех местах, где вам нужно сериализовать цвета. Если вы хотите сделать XML-читаемый (а не произвольное целое число ARGB), вы можете использовать методы to/from HTML, как описано в balabaster.