Laden...

Generische Methoden für das Speichern und Laden von Objekten in XML Dateien

Erstellt von Somakia vor 11 Jahren Letzter Beitrag vor 11 Jahren 4.777 Views
S
Somakia Themenstarter:in
269 Beiträge seit 2010
vor 11 Jahren
Generische Methoden für das Speichern und Laden von Objekten in XML Dateien

Beschreibung:

Hallo liebe myC#-Com
da ich immer mal wieder Objekte im XML Format speichern und laden muss, habe ich mir eine Klasse mit 2 öffentliche Methoden geschrieben, mit welcher ich das einfach machen kann...

Attention please: Ich habe diesen Code unter .NET 4.0 entwickelt und kann nicht garantieren, dass er unter anderen Versionen auch läuft.
Für Informationen zu Risiken und Nebenwirkungen befragen sie ihre IDE oder die MSDN.
Attention please (2): Ich kann aktuell noch nicht beurteilen, ob die Methode private static Boolean IsObjectSerializable<T>(T obj) where T : class, new() bei Listen oder listenähnlichen Typen (IEnumerable, ICollection) zuverlässig/richtig arbeitet... für diesen speziellen Fall von Typ werde ich die Methode noch ein wenig anpassen in nächster Zeit. Ob das Update dann hier gepostet wird, kommt darauf an, ob ich mich daran erinnere, dass ich es noch posten wollte. Durch Update hinfällig geworden, Methode nicht mehr existent!

Anmerkung zur Benutzung:
Folgende Anmerkungen basieren rein auf meinem Wissen und könnten u.U. Fehlinformationen enthalten. Korrekturen werden per PN entgegen genommen!
Zur Serialisierung einer Klasse sollte diese zumindest mit dem [Serializable()] - Attribut versehen sein, wenn die Klasse nicht sogar das ISerializable-Interface implementiert (für mich reicht immer das Attribut) Durch Update hinfällig geworden, weder Attribut noch Ableitung sind für XML-Serialisierung notwendig!
Die Klasse MUSS einen parameterlosen Konstruktor besitzen.
Es werden nur öffentliche Felder und Properties gespeichert und geladen. Das war nicht meine Entscheidung, so funktioniert .Net
Für alle Daten die also gespeichert werden sollen sollten public Fields existieren oder Properties. Properties brauchen public get und set!
Alle zu serialisierenden Felder und Properties in einer Klasse selbst müssen auch Serialisierbar sein. Dies kann in der MSDN nachgesehen werden bzw. bei eigenen Klassen hat man selbst dafür zu sorgen.


/*
\* Copyright (c)2012 Karill Endusa
\* This code is provided as is. The author is not responsible for what happens if you use it,
\* especially but not limited to using it like you don&#39;t know what you are doing
\* or if you really don&#39;t know what you are doing.
\* Last Modified: 2012-11-19
\*/

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Xml.Serialization;

namespace ObjectSerializer
{
	public class ObjectToXmlSerializer
	{
		public static void Serialize<T>(T obj, String FileName) where T : class, new()
		{
			try
			{
				if(obj == null)
					throw new ArgumentNullException("obj");

				XmlSerializer ser = new XmlSerializer(typeof(T));
				using(FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.None))
				{
					using(TextWriter tw = new StreamWriter(fs))
					{
						ser.Serialize(tw, obj);
					}
				}
			}
			catch(Exception ex)
			{
				throw new XmlSerializationException("XML-Serialization failed", ex);
			}
		}

		public static T Deserialize<T>(String FileName) where T : class, new()
		{
			T obj = null;
			try
			{
				if(!File.Exists(FileName))
					throw new FileNotFoundException("Unable to find given to be deserialized file!", FileName);

				XmlSerializer ser = new XmlSerializer(typeof(T));
				using(FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.None))
				{
					using(TextReader tr = new StreamReader(fs))
					{
						obj = (T)ser.Deserialize(tr);
					}
				}
			}
			catch(Exception ex)
			{
				throw new XmlSerializationException("XML-Deserialization failed", ex);
			}
			return obj;
		}

		[Serializable]
		public class XmlSerializationException : Exception
		{
			public XmlSerializationException()
			{
			}

			public XmlSerializationException(string message)
				: base(message)
			{
			}

			public XmlSerializationException(string message, Exception inner)
				: base(message, inner)
			{
			}

			protected XmlSerializationException(
			  System.Runtime.Serialization.SerializationInfo info,
			  System.Runtime.Serialization.StreamingContext context)
				: base(info, context)
			{
			}
		}
	}
}

Kritik, sowohl positive als auch negative, sowie Anmerkungen zu möglichen Verbesserungen und Erweiterungen der Klasse werden gerne entgegen und zu Herzen genommen.

//EDIT 22.11.2012 08:45
Nach einem Hinweis eines Mitgliedes aus der Community wurden die Prüfungen auf Serialisierbarkeit entfernt. Dieses haben im Endeffekt nur auf das Vorhandensein des [SerializableAttribute()] geprüft, welches jedoch nicht für XML-Serialisierung benötigt wird.

Schlagwörter: XML, XmlSerializer, Serialize, Deserialize