Heute wollen wir uns mit dem Speichern und Laden von Bildern in einer XML-Datei befassen.
Letztenendes ist das nicht sehr kompliziert, es müssen nur die richtigen Komponenten zusammengesetzt werden.
Ein Bild (hier im Bitmap-Format) wird per
das Byte-Array wird in einen formatierten Base64-String konvertiert,
dieser String wird in der XML-Datei abgelegt:
Get
Die Gegenrichtung ist äquivalent:
Der aus der XNL-Datei gelesene Base64-String wird in ein Byte-Array konvertiert,
mit diesem wird ein
mit diesem wird die Ziel-Bitmap erstellt:
Der ganze Code wird in eine Datenklasse gepackt, und es wird dafür gesorgt, dass nicht die Bitmap, sondern der Base64-String in die XML-Datei geschrieben wird:
Image
Das Lesen und Schreiben der XML-Datei selbst erfolgt mit diesem Code:
Speichern und Laden
Im Anhang das komplette Projekt:
XmlSerializedImage.zip
Letztenendes ist das nicht sehr kompliziert, es müssen nur die richtigen Komponenten zusammengesetzt werden.
Ein Bild (hier im Bitmap-Format) wird per
MemoryStream
in ein Byte-Array geschrieben,das Byte-Array wird in einen formatierten Base64-String konvertiert,
dieser String wird in der XML-Datei abgelegt:
C#-Quellcode
- get
- {
- // Serialisierung:
- // Bereichstest
- if (this.Image == null)
- {
- return null;
- }
- // Byte-Array, in dem das Image gespeichert wird
- byte[] array;
- // das Image in ein Byte-Array speichern
- using (MemoryStream ms = new MemoryStream())
- {
- this.Image.Save(ms, ImageFormat.Png);
- array = ms.ToArray();
- }
- // Länge aufgerundet bestimmen:
- // https://de.wikipedia.org/wiki/Base64
- int len = (int)(array.Length * 1.4);
- // Char-Array für den Base64-String
- char[] charArray = new char[len];
- // das Char-Array in einen formatierten Base64-String konvertieren
- int len2 = Convert.ToBase64CharArray(array, 0, array.Length, charArray, 0, Base64FormattingOptions.InsertLineBreaks);
- // den Base64-String mit der korrekten Länge zurückgeben
- return new String(charArray, 0, len2);
- }
Die Gegenrichtung ist äquivalent:
Der aus der XNL-Datei gelesene Base64-String wird in ein Byte-Array konvertiert,
mit diesem wird ein
MemoryStream
instanziiert,mit diesem wird die Ziel-Bitmap erstellt:
Der ganze Code wird in eine Datenklasse gepackt, und es wird dafür gesorgt, dass nicht die Bitmap, sondern der Base64-String in die XML-Datei geschrieben wird:
C#-Quellcode
- /// <summary>
- /// Das zu serialisierende Image,
- /// das nicht serialisiert wird
- /// </summary>
- [XmlIgnore]
- public Bitmap Image { get; set; }
- /// <summary>
- /// Der aus Image ermittelte formatierte Base64-String,
- /// der unter dem Namen "Image" serialisiert wird
- /// </summary>
- [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
- [XmlElement("Image")]
- public string ImageSerialized
- {
- {
- get { ... }
- set { ... }
- }
- }
Das Lesen und Schreiben der XML-Datei selbst erfolgt mit diesem Code:
C#-Quellcode
- /// <summary>
- /// XML-Serialisierung der Instanz einer Datenklasse
- /// </summary>
- /// <param name="data">zu serialisierende Instanz</param>
- /// <param name="file">Pfad zum Abspeichern</param>
- public void WriteData(MyData data, string file)
- {
- // Serialize object to a XML file.
- using (StreamWriter sw = new StreamWriter(file, false, Encoding.Default))
- {
- XmlSerializer x = new XmlSerializer(data.GetType());
- x.Serialize(sw, data);
- }
- }
- /// <summary>
- /// XML-Deserialisierung einer Datenklasse
- /// </summary>
- /// <param name="file">Pfad zum Einlesen</param>
- /// <returns>
- /// die erstellte Instanz der Datenklasse
- /// </returns>
- public MyData LoadData(string file)
- {
- MyData data = new MyData();
- try
- {
- // Deserialize XML file to a new object.
- using (StreamReader sr = new StreamReader(file, Encoding.Default))
- {
- XmlSerializer x = new XmlSerializer(data.GetType());
- data = (MyData)x.Deserialize(sr);
- }
- return data;
- }
- catch
- {
- // nix tun, die Daten-Instanz ist nicht valid,
- // es wird die leere Instanz zurückgegeben
- }
- return data;
- }
Im Anhang das komplette Projekt:
XmlSerializedImage.zip
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!