Aus welchem Grund auch immer hat Microsoft für den Typ Color keine Serialisierung implementiert. (Bei anderen struct Typen, wie Point oder Size, die in etwa gleich wichtig und häufig verwendeten werden, haben sie das nicht vergessen)
Damit stellt sich das Problem, dass ein Workaround für die De-/Serialisierung verwendet werden muss, damit Farben z.B. in Configurationsdateien abgelegt und wieder eingelesen werden können.
Meine Lösung implementiert eine Extension für den Typ string, damit die Farbangaben als Namen wie in der Klasse Color oder als ARGB Wert verwendet werden können.
Die Anwendung für ein zu serialisierendes Property in einer Datenstruktur ist sehr simpel und sieht wie folgt aus:
[XmlIgnore]
public Color MyColor { get; set; }
[EditorBrowsable( EditorBrowsableState.Never )]
public string MyColorXml
{
get { return MyColor.Name; }
set { MyColor = value.ToColor(); }
}
/// <summary>
/// Returns a <see cref="Color"/> object based on its color name. The 'color name'
/// is of the color from <see cref="Color.KnownColor"/> or a hexadecimal value as
/// returned by <see cref="Color.Name"/> (hex format: 'aarrggbb').
/// <para>
/// This can be very easily used, for example, for XML serialisation
/// where type <see cref="Color"/> can not be used:
/// <pre>
/// [XmlIgnore]
/// public Color MyColor { get; set; }
/// [EditorBrowsable( EditorBrowsableState.Never )]
/// public string MyColorXml
/// {
/// get { return MyColor.Name; }
/// set { MyColor = value.ToColor(); }
/// }
/// </pre>
/// </para>
/// </summary>
/// <returns>A <see cref="Color"/> object.</returns>
public static Color ToColor( this string thisValue )
{
Color color = Color.FromName( thisValue );
if( !color.IsKnownColor )
{
try
{
// try to convert from hex format: aarrggbb
int iResult = Convert.ToInt32( thisValue, 16 );
color = Color.FromArgb( iResult >> 24 & 0xff, iResult >> 16 & 0xff, iResult >> 8 & 0xff, iResult & 0xff );
}
catch { }
}
return color;
}
4 Kommentare zum Snippet