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
}
}