using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Serialization; using System.IO; using System.Xml; namespace Yaulw.Xml { /// /// Wrapper class around XMLReading/Writing (Serialization) /// public class XSerializer { #region Private Members private XmlSerializer _Serializer = null; private Type _SerializerAssignedToType = null; #endregion #region * Private Initialization * Called at the begining of every function call /// /// Pass in a valid XML Serializable Object in order to initialize the XML Serializer /// ~Only newes a NEW Serializer object if the underlying Type for this class changed /// /// Thrown if an invalid XmlObject is passed in /// Thrown if by the end of this function, no Serializer Object Exists private void InitializeSerializer() { // Create the Serializer Object, if Needed bool bCreateSerializer = false; if (_Serializer == null) bCreateSerializer = true; else if (_SerializerAssignedToType != typeof(T)) bCreateSerializer = true; if (bCreateSerializer) { _Serializer = null; _SerializerAssignedToType = null; // Create Serializer Obj _SerializerAssignedToType = typeof(T); _Serializer = new XmlSerializer(typeof(T)); } // Something is wrong, if Serializer, is not created at this point if (_Serializer == null) throw new OutOfMemoryException(); } #endregion #region Construction public XSerializer() { } #endregion #region Public Methods /// /// Reads in an XML Object from a String /// /// XMLSerializable Type /// an xml string to read /// Deserialized Object public T ReadFromString(string xml) { InitializeSerializer(); // Deserialize the Resource and return the Object using (StringReader reader = new StringReader(xml)) { T retVal = (T)_Serializer.Deserialize(reader); return retVal; } } /// /// Reads in an XML Object from a String /// /// XMLSerializable Type /// an xml stream to read /// Deserialized Object public T ReadFromStream(Stream xml) { InitializeSerializer(); // Deserialize the Resource and return the Object using (StreamReader reader = new StreamReader(xml)) { T retVal = (T)_Serializer.Deserialize(reader); return retVal; } } /// /// Reads in an XML Object from a Stream (Resource) /// /// XMLSerializable Type /// A Stream to read from /// Deserialized Object public T ReadFromResource(Stream ResourceStream) { InitializeSerializer(); // Deserialize the Resource and return the Object using (TextReader reader = new StreamReader(ResourceStream)) { T retVal = (T)_Serializer.Deserialize(reader); return retVal; } } /// /// Reads in an XML Object from a File /// /// XMLSerializable Type /// Valid Path to XML File to Deserialize /// Deserialized Object, or null if file not found public T ReadFromFile(string PathNFileName) { InitializeSerializer(); // Check File Existence if (!System.IO.File.Exists(PathNFileName)) return default(T); // Deserialize the File and return the Object using (TextReader reader = new StreamReader(PathNFileName)) { T retVal = (T)_Serializer.Deserialize(reader); return retVal; } } /// /// Writes an XML Object to a String /// /// XMLSerializable Type /// An XML Serializable Object, can be null to write Blank Object /// a serialized XML Object as a string public string WriteToString(T XmlObject) where T : new() { InitializeSerializer(); // Determine 'Blank' or Running Object T objectToSerialize = default(T); if (XmlObject == null) objectToSerialize = new T(); else objectToSerialize = XmlObject; using (StringWriter writer = new StringWriter()) { _Serializer.Serialize(writer, objectToSerialize); return writer.ToString(); } } /// /// Writes an XML Object to a File /// /// XMLSerializable Type /// An XML Serializable Object, can be null to write Blank Object /// Valid Path to XML File to Serialize public void WriteToFile(T XmlObject, string PathNFileName) where T : new() { InitializeSerializer(); // Create output directory, if not exists if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(PathNFileName))) System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(PathNFileName)); // Determine 'Blank' or Running Object T objectToSerialize = default(T); if (XmlObject == null) objectToSerialize = new T(); else objectToSerialize = XmlObject; // Write File; using (TextWriter writer = new StreamWriter(PathNFileName)) { _Serializer.Serialize(writer, objectToSerialize); } } #endregion } }