using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace Tango.Serialization
{
/// <summary>
/// Represents a data serializer for serializing data using standard xml serializer.
/// </summary>
public class XmlDataSerializer : IDataSerializer
{
/// <summary>
/// Serialize object to a file.
/// </summary>
/// <typeparam name="T">Type of specified object.</typeparam>
/// <param name="obj">The specified object.</param>
/// <param name="filePath">The full path to the file to write.</param>
public void SerializeToFile<T>(T obj, string filePath)
{
using (FileStream fs = new FileStream(filePath, FileMode.Create))
{
SerializeToStream<T>(obj, fs);
}
}
/// <summary>
/// Serialize object to encrypted file.
/// </summary>
/// <typeparam name="T">Type of specified object.</typeparam>
/// <param name="obj">The specified object.</param>
/// <param name="filePath">The full path to the file to write.</param>
public void SerializeToEncryptedFile<T>(T obj, string filePath)
{
var plainText = SerializeToString(obj);
var cypherText = CryptographyHelper.Encrypt(plainText);
File.WriteAllText(filePath, cypherText);
}
/// <summary>
/// Serialize object to encrypted string.
/// </summary>
/// <typeparam name="T">Type of specified object.</typeparam>
/// <param name="obj">The specified object.</param>
public String SerializeToEncryptedString<T>(T obj)
{
var plainText = SerializeToString(obj);
var cypherText = CryptographyHelper.Encrypt(plainText);
return cypherText;
}
/// <summary>
/// Deserialize object from encrypted file.
/// </summary>
/// <typeparam name="T">Type of object to deserialize.</typeparam>
/// <param name="filePath">The full path of the data file.</param>
/// <returns>The resulting object.</returns>
public T DeserializeFromEncryptedFile<T>(string filePath)
{
var cypherText = File.ReadAllText(filePath);
var plainText = CryptographyHelper.Decrypt(cypherText);
return DeserializeFromString<T>(plainText);
}
/// <summary>
/// Deserialize object from encrypted string.
/// </summary>
/// <typeparam name="T">Type of object to deserialize.</typeparam>
/// <returns>The resulting object.</returns>
public T DeserializeFromEncryptedString<T>(string encyptedString)
{
var plainText = CryptographyHelper.Decrypt(encyptedString);
return DeserializeFromString<T>(plainText);
}
/// <summary>
/// Deserialize object from a file.
/// </summary>
/// <typeparam name="T">Type of object to deserialize.</typeparam>
/// <param name="filePath">The full path of the data file.</param>
/// <returns>The resulting object.</returns>
public T DeserializeFromFile<T>(string filePath)
{
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
return DeserializeFromStream<T>(fs);
}
}
/// <summary>
/// Serialize object to stream.
/// </summary>
/// <typeparam name="T">Type of specified object.</typeparam>
/// <param name="obj">The specified object.</param>
/// <param name="st">The stream to write.</param>
public void SerializeToStream<T>(T obj, Stream st)
{
XmlSerializer f = XmlSerializer.FromTypes(new[] { typeof(T) })[0]; //Microsoft bug workaround.
f.Serialize(st, obj);
}
/// <summary>
/// Serialize object to string.
/// </summary>
/// <typeparam name="T">Type of specified object.</typeparam>
/// <param name="obj">The specified object.</param>
/// <returns></returns>
public String SerializeToString<T>(T obj)
{
XmlSerializer f = XmlSerializer.FromTypes(new[] { typeof(T) })[0]; //Microsoft bug workaround.
using (StringWriter textWriter = new StringWriter())
{
f.Serialize(textWriter, obj);
return textWriter.ToString();
}
}
/// <summary>
/// Deserialize object from stream.
/// </summary>
/// <typeparam name="T">Type of object to deserialize.</typeparam>
/// <param name="st">Stream to read from.</param>
/// <returns>The resulting object.</returns>
public T DeserializeFromStream<T>(Stream st)
{
XmlSerializer f = XmlSerializer.FromTypes(new[] { typeof(T) })[0]; //Microsoft bug workaround.
return (T)f.Deserialize(st);
}
/// <summary>
/// Deserialize object from string.
/// </summary>
/// <typeparam name="T">Type of specified object.</typeparam>
/// <param name="obj">The specified object.</param>
/// <returns></returns>
public T DeserializeFromString<T>(String str)
{
XmlSerializer f = XmlSerializer.FromTypes(new[] { typeof(T) })[0]; //Microsoft bug workaround.
using (TextReader reader = new StringReader(str))
{
return (T)f.Deserialize(reader);
}
}
/// <summary>
/// Returns the serializer full name.
/// </summary>
/// <returns></returns>
public override string ToString()
{
return SerializationHelper.GetSerializerName(this);
}
}
}