Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1895 | Besucher online: 167
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)

Typen mit dem XmlSerializer (de-)serialisieren


Autor: Oliver Kremer
Sprache: C#
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 2967
  
Kick it on dotnet-kicks.de  

Beschreibung:

Schon mal versucht, den Typ Color mit dem XmlSerializer zu serialisieren? Oder einen Font? Funktioniert nicht so einfach. Es gibt diverse Workarounds. Hier ist mein Ansatz:

Die Klasse Property speichert Namen und Wert einer Eigenschaft.

Die Klasse PropertySerializer führt eine Liste mit Eigenschaften. Diese Liste wird letzlich gespeichert. Die Methoden Set und Get ermitteln aus dem StackTrace, welche durch welche Eigenschaft sie aufgerufen wurden, was die Bedinung der Klasse stark vereinfacht.

Die Klasse PropertyBase dient als Basisklasse für alle Klassen, die von der Funktionalität Gebrauch machen wollen.

Die Klasse Test demonstriert den Gebrauch der Klasse. Die Verwendung der Methoden Set und Get ist die bequemste Variante. Die Eigenschaft "Farbe1" demonstriert die ein wenig umständlichere Variante.

In jedem Fall müssen alle Eigenschaften der abgeleiteten Klasse (die sollen ja nicht direkt serialisiert werden) mit dem XmlIgnoreAttribute dekoriert werden.

Für die meisten Typen gibt es TypeConverter. Für solche, für die es keine gibt kan man sich auch einen eigenen schreiben...

Die Test-Klasse würde dann so verwendet:


Test t1 = new Test();
t1.Farbe = Color.Red;
t1.Datum = DateTime.Now;

PropertySerializer.Save(t1, @"C:\delete\test.xml");

Test t2 = PropertySerializer.Load(@"C:\delete\test.xml");



Abgelegt unter: TypeConverter, Serialisierung, Xml, Color.



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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
public class Test : PropertyBase
{
	[XmlIgnore()]
	public Color Farbe
	{
		set 
		{ 
			Serializer.Set<Color>(value); 
		}
		get 
		{ 
			return Serializer.Get<Color>(); 
		}
	}
	[XmlIgnore()]
	public Color Farbe1
	{
		get 
		{ 
			return (Color)new ColorConverter().ConvertFromString(Serializer.GetProperty("Farbe1")); 
		}
		set 
		{ 
			Serializer.SetProperty("Farbe", new ColorConverter().ConvertToString(value)); 
		}
	}
	[XmlIgnore()]
	public Font Schriftart
	{
		set
		{
			Serializer.Set<Font>(value);
		}
		get
		{
			return Serializer.Get<Font>();
		}
	}
	[XmlIgnore()]
	public Rectangle Viereck
	{
		get { return Serializer.Get<Rectangle>(); }
		set { Serializer.Set<Rectangle>(value); }
			
	}
	[XmlIgnore()]
	public string Zeichenkette
	{
		get { return Serializer.Get<string>(); }
		set { Serializer.Set<string>(value); }
	}
	[XmlIgnore()]
	public int Zahl
	{
		get { return Serializer.Get<int>(); }
		set { Serializer.Set<int>(value); }
	}
	[XmlIgnore()]
	public DateTime Datum
	{
		get { return Serializer.Get<DateTime>(); }
		set { Serializer.Set<DateTime>(value); }
	}

	public Test()
	{ }
}

[Serializable]
public abstract class PropertyBase
{
	public PropertySerializer Serializer { get; set; }
	public PropertyBase()
	{
		Serializer = new PropertySerializer();
	}
}

[Serializable]
public class Property
{
	[XmlAttribute()]
	public string Name;
	[XmlAttribute()]
	public string Value;
	public Property()
	{ }
	public Property(string name, string value)
	{
		Name = name;
		Value = value;
	}
	public override string ToString()
	{
		return Name + " : " + Value;
	}
}
[Serializable]
public class PropertySerializer
{
	/// <summary>
	/// Die Liste mit den Eigenschaften und deren Werten.
	/// </summary>
	public List<Property> Properties { get; set; }
	/// <summary>
	/// Initialisiert eine neue Instanz dieser Klasse.
	/// </summary>
	public PropertySerializer()
	{
		Properties = new List<Property>();
	}

	/// <summary>
	/// Trägt die Eigenschaft und deren Wert in die Liste <see cref="Properties"/> ein.
	/// Nicht vorhandene Eigenschaften werden hinzugefügt, vorhandene aktualisiert.
	/// </summary>
	/// <param name="name">Der Name der Eigenschaft.</param>
	/// <param name="value">Der Wert der Eigenschaft</param>
	public void SetProperty(string name, string value)
	{
		int i = Properties.FindIndex(x => x.Name == name);

		if (i > -1)
		{
			Properties[i].Value = value;
		}
		else
		{
			Properties.Add(new Property(name, value));
		}
	}
	/// <summary>
	/// Ruft den Wert der angegebenen Eigenschaft ab.
	/// </summary>
	/// <param name="name">Der Name der Eigenschaft.</param>
	/// <returns>Den Wert der Eigenschaft, oder eine leere Zeichenkette, wenn die
	/// Eigenschaft nicht vorhanden ist.</returns>
	public string GetProperty(string name)
	{
		int i = Properties.FindIndex(x => x.Name == name);
		if (i > -1)
		{
			return Properties[i].Value;
		}
		else
		{
			return String.Empty;
		}
	}
	/// <summary>
	/// Legt den Wert einer Eigenschaft fest.
	/// </summary>
	/// <typeparam name="T">Der Typ der Eigenschaft.</typeparam>
	/// <param name="value">Der Wert der Eigenschaft.</param>
	public void Set<T>(T value)
	{
		string s = new StackTrace(System.Threading.Thread.CurrentThread, true)
		.GetFrame(1)
		.GetMethod().Name;

		s = s.Substring(4, s.Length - 4);

		SetProperty(s, TypeDescriptor.GetConverter(typeof(T)).ConvertToString(value));
	}
	/// <summary>
	/// Ruft den Wert einer Eigenschaft ab.
	/// </summary>
	/// <typeparam name="T">Der Typ der Eigenschaft.</typeparam>
	/// <returns>Den Wert der Eigenschaft.</returns>
	public T Get<T>()
	{
		string s = new StackTrace(System.Threading.Thread.CurrentThread, true)
		.GetFrame(1)
		.GetMethod().Name;

		s = s.Substring(4, s.Length - 4);

		string value = GetProperty(s);

		return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value);
	}

	/// <summary>
	/// Speichert eine Klasse.
	/// </summary>
	/// <typeparam name="T">Der Typ der zu ladenden Klasse.</typeparam>
	/// <param name="candidate">Die zu speichernde Klasse.</param>
	/// <param name="path">Der vollqualifizierte Name der Zieldatei.</param>
	public static void Save<T>(T candidate, string path) where T : PropertyBase
	{
		XmlSerializer ser = new XmlSerializer(typeof(T));
		using (FileStream str = new FileStream(path, FileMode.Create))
		{
			ser.Serialize(str, candidate);
		}
	}
	/// <summary>
	/// Läd eine Klasse.
	/// </summary>
	/// <typeparam name="T">Der Typ der zu ladenden Klasse.</typeparam>
	/// <param name="path">Der vollqualifizierte Name der Quelldatei.</param>
	/// <returns>Die geladene Instanz der Klasse.</returns>
	public static T Load<T>(string path) where T :PropertyBase
	{
		XmlSerializer xser = new XmlSerializer(typeof(T));
		T ps;

		using (StreamReader sr = new StreamReader(path))
		{
			ps = (T)xser.Deserialize(sr);
			sr.Close();
		}

		return ps;
	}
}
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.)



Diese Snippets könnten für Sie interessant sein:
[C#] Generische XML-Serialisierung
[C#] Type Color serialisieren und deserialisieren
[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#] Objekt in XML speichern (Serialisieren)
[C#] Treeview in XML schreiben
[ASP.net] XML - HTML Transformation
[C#] XML Encoding eines XmlDocument ändern
[C#] XMLDocument in XDocument konvertieren
[C#] Rss Feed in XMLDocument laden
[VB.NET] XML Datei in DataSet einlesen
[VB.NET] Objekt mit dem XmlSerializer serialisieren
[VB.NET] XML Datei mit dem XmlSerializer deserialisieren
[C#] Image zu Base64 konvertieren und zurück
[C#] CSV und XML-Datei Datenbank-Import (incl. valid-check)
[C#] Währungskurse in Datenbank speichern
[VB.NET] Einfaches Erstellen einer XML Datei in .Net
[C#] XML in DataTable laden
[C#] Intellisense Unterstützung für XML Dateien für LINQ
[C#] user.config und generische Listen
[C#] Dataset verschlüsseln
[C#] Xml Datei entschlüsseln
[ASP.net] XML Daten über einen Internet Proxy abfragen
[C#] XML-Programmkonfiguration / -Steuerung
[C#] Formatieren von Sonderzeichen für XML
[C#] Binärdatei in XML File speichern
[C#] Binärdatei aus XML Datei auslesen und abspeichern
[C#] leere Knoten aus XML Document entfernen
[C#] XML Kommentare entfernen
[C#] Austauch von kritischen Zeichen in einem String...
[C#] Excel-Export ohne Excel (auch für Web)
[C#] Ini-Datei-Klasse
[C#] TreeView Export To Xml OR Import from XMl
[C#] Autom. Laden & Speichern von Position und Größe eines Forms
[VB.NET] Bild als XML Datei Speichern
[C#] Ein Object serialisieren
[C#] Ein Object deserialisieren
[C#] Konvertiert Code nach Example für XML-Kommentar
[C#] XMLIO - einfachstes (De)serialisieren von/zu XML-Dateien
[C#] Generisch XML De-/ Serialisieren
[C#] XML generieren mit Linq to XML
[C#] Spracherkennung
[C#] Wunderground Wettervorhersage
[C#] Mit LINQtoXML XML Dateien erzeugen bzw. abfragen
[C#] ini Datei anlegen - mit Dictionary
[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)

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