La mejor solución para XmlSerializer y System.Drawing.Color

Los objetos System.Drawing.Color aparentemente no se serializarán con XmlSerializer. ¿Cuál es la mejor manera de xml serializar colores?

El método más simple usa esto en su corazón:

String HtmlColor = System.Drawing.ColorTranslator.ToHtml(MyColorInstance); 

Simplemente convertirá el color que sea a la cadena hexadecimal estándar utilizada por HTML, que se deserializa fácilmente usando:

 Color MyColor = System.Drawing.ColorTranslator.FromHtml(MyColorString); 

De esa manera solo estás trabajando con cadenas estándar de pantano …

Versión final de trabajo:

 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); } } 

Usamos esto:

 [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); } } 

Podría escribir una clase contenedora simple para Color que exponga los valores ARGB como propiedades. Puede traducir a / desde los colores usando desde / hacia conversiones ARGB (vea documentos ). Algo como:

 [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(); } } } 

¡Probablemente también quiera un accesorio para el color!

El beneficio de esto es que la clase se puede usar en todos los lugares donde se deben serializar los colores. Si desea que el XML sea legible (en lugar de un entero ARGB arbitrario) puede usar los métodos to / from HTML descritos por balabaster.