Aquí hay algo que estoy usando para serializar la estructura Color
en XML. Es mejor que sombrear la propiedad primaria Color
en mi opinión. Cualquier sugerencia bienvenida
La clase XmlColor
se basa principalmente en la característica de lenguaje implicit operator
para proporcionar las transformaciones de datos clave. Sin esto, la clase es básicamente inútil. Se agregaron otros bits de funcionalidad para completar la clase.
El asistente XmlColor
también proporciona una manera conveniente de separar los componentes de color. Agregué la propiedad Alpha
para mostrar esto. Observe el componente Alpha
no será serializado si está acodado todo el camino hasta 255.
deserializar el valor de color Web
combina el valor Alpha
almacenada actualmente en la instancia. El orden en que se analizan los atributos no debería importar. Si falta el atributo Alpha
en el origen XML, el valor del componente de la instancia se utilizará para establecer el nivel Alpha
. Esto es discutiblemente defectuoso; Sin embargo, en el caso de serialización XML, la clase XmlColor
será inicializado con Color.Black
establecer el Alpha
a 255.
estoy trabajando fuera del entorno de VS2010 y edificio contra .Net 4. No tengo idea de su grado de compatibilidad del código es con versiones anteriores.
Aquí es una propiedad de ejemplo que debe ser serializado a XML:
[XmlElement(Type=typeof(XmlColor))]
public Color MyColor { get; set; }
Aquí está la clase XmlColor
ayudante:
public class XmlColor
{
private Color color_ = Color.Black;
public XmlColor() {}
public XmlColor(Color c) { color_ = c; }
public Color ToColor()
{
return color_;
}
public void FromColor(Color c)
{
color_ = c;
}
public static implicit operator Color(XmlColor x)
{
return x.ToColor();
}
public static implicit operator XmlColor(Color c)
{
return new XmlColor(c);
}
[XmlAttribute]
public string Web
{
get { return ColorTranslator.ToHtml(color_); }
set {
try
{
if (Alpha == 0xFF) // preserve named color value if possible
color_ = ColorTranslator.FromHtml(value);
else
color_ = Color.FromArgb(Alpha, ColorTranslator.FromHtml(value));
}
catch(Exception)
{
color_ = Color.Black;
}
}
}
[XmlAttribute]
public byte Alpha
{
get { return color_.A; }
set {
if (value != color_.A) // avoid hammering named color if no alpha change
color_ = Color.FromArgb(value, color_);
}
}
public bool ShouldSerializeAlpha() { return Alpha < 0xFF; }
}
Creo que ha llegado a los límites de la serialización de XML. Es posible que desee buscar en la serialización de DataContract en su lugar, – leppie