Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1551 | Anzahl registrierter User: 1841 | Besucher online: 182
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Type Color serialisieren und deserialisieren


Autor: infero
Sprache: C#
Bewertung:
7.22 (2 votes)
Anzahl der Aufrufe: 6370
  
Kick it on dotnet-kicks.de  

Beschreibung:

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



Abgelegt unter: Color, Serialisierung, Extension.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/// <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;
}



Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Günther Foidl schrieb am:  08.12.2008 11:05:22

Die Color-Struktur ist mit dem Serializable-Attribut "dekoriert". Insofern lässt sie sich auch serialisieren/deserialisiern (auch in XML).

Für die Konvertierung könnte auch ein ColorConverter verwendet werden. Dennoch finde ich die Bitverschiebungen cool ;)
infero schrieb am:  08.12.2008 17:11:52

Mit Serializable-Attribute alleine ist noch nicht definiert, dass die Implementierung auch sauber funktioniert.

Mit folgendem Code wird keine Farbe serialisiert (es entsteht nur ein leeres Tag):

[Serializable]
public class ABC
{
public Color MyColor { get; set; }

public ABC()
{
MyColor = Color.Blue;
}
}

private void Form1_Load( object sender, EventArgs e )
{
string strFileName = @"C:\temp\Data.xml";

using( TextWriter writer = new StreamWriter( strFileName ) )
{
ABC data = new ABC();
Console.WriteLine( "Before serialization: MyColor = " + data.MyColor.ToString() );
XmlSerializer serializer = new XmlSerializer( data.GetType() );
serializer.Serialize( writer, data );
}

using( TextReader reader = new StreamReader( strFileName ) )
{
XmlSerializer serializer = new XmlSerializer( typeof( ABC ) );
ABC data = (ABC)serializer.Deserialize( reader );
Console.WriteLine( "After serialization: MyColor = " + data.MyColor.ToString() );
}
}


Die Ausgabe ist dabei:
Before serialization: MyColor = Color [Blue]
After serialization: MyColor = Color [Empty]
Günther Foidl schrieb am:  09.12.2008 00:33:58

Aha, schade. Interessant aber dass es bei den Settings (mit Desinger ertellt) problemlos funktioniert.
infero schrieb am:  09.12.2008 09:18:51

Das ist nicht weiter verwunderliche, denn die Settings (mit dem Designer) funktionieren ganz anders als die 'normale' Serialisierung.


Diese Snippets könnten für Sie interessant sein:
[C#] Hexstring in System.Drawing.Color umwandeln
[VB.NET] Austauschbares Farblayout-System
[VB.NET] Alle Pixel einer bestimmten Farbe neu einfärben
[C#] Zufallsfarbe erzeugen
[VB.NET] Die Farbe eines Pixels in einer Windows Form abfragen
[C#] Die Farbe eines Pixels in einer Windows Form abfragen
[C#] Alle verfügbaren Farben mittels WPF ausgeben
[C#] Hintergrundfarbe Transparenter Bilder (z.B. PNG) ändern
[C#] Größe eines Bildes mit mit gleichem Seitenverhältniss ändern
[C#] Farbe per Prozentwert ändern (grün bis rot)
[C#] ColorMap für Falschfarben
[C#] Color Extension-Methods
[VB.NET] Bild mit allen farben (True Color 16 Millionen Farben)
[C#] Typen mit dem XmlSerializer (de-)serialisieren
[C#] Generische XML-Serialisierung
[C#] Generische, verschlüsselte Serialisierung und Deserialisieru
[C#] Serializable TimeSpan
[C#] Object to Base64 string
[C#] Serialisiert Typ in ein komprimiertes bytearray
[C#] generische De-/ Serialisierung von Objekten in XML und Binär
[C#] 3 arten der Serialisierung bzw Deserialisierung
[C#] Datei/Ordner durch Erweiterungsmethoden abfragen
[C#] Programmpfad mittels Erweiterung ermitteln
[C#] Invoke Beispiel mittels Erweiterungs Methoden.
[C#] DateTime Extensions liefern TimeStamp
[C#] Komplette Exception Message (inkl. InnerExceptions) ausgeben
[VB.NET] Programmpfad mittels Erweiterung ermitteln in VB
[C#] LINQ-Erweiterung für eindeutige Liste
[C#] Controls gleichen Typs von einem Container in Winform holen
[C#] Extension in einem Dateinamen/Pfad ändern
[C#] Threadsicherer Codeaufruf im Control-Kontext (Invoking)
[C#] Selektieren eines gekapselten Eintrags aus der ComboBox
[C#] IsNull and IsNullOrEmpty Extension-Methods become Lazy
[C#] Enum-Extension - Flag in einem Bitfeld gesetzt?
[C#] Anzahl der Monate zwischen 2 DateTime-Objekten (Extension)
[C#] "for" mal anders
[C#] Generische Event Args -> EventArgs
[C#] Lazy Serialization-Extensions including Compression
[C#] SystemIconsImageListWrapper

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.