While digging, breaking and smashing around some code (aka refactoring), I found some redundant code that serialized and deserialized objects to files at various places. With a little effort a centralized helper class was created.
Serialization can be useful in many ways. I prefer to use it to save stuff like metadata using an object which has compile-time support, is easier to maintain* and delivers more readable code.
*) Due to compile-time support, but changes to fields could have breaking effects on existing files. Consider using XmlElementAttribute("Name") attribute on target properties for fixed element names.
Usage
Here is a simplyfied example to show how it works:public static void SerializationExample()As you can see, a few lines can dump or restore an object.
{
var tagData = new MovieTagData("Science fiction", "Scifi", "Monkeys", "Battle");
var path = "C:\Movies\Planet of the Apes.avi.xml";
ObjectXmlSerializer.Serialize(tagData , path);
}
public static void DeserializationExample()
{
var path = "C:\Movies\Planet of the Apes.avi.xml";
var tagData = ObjectXmlSerializer.Deserialize<MovieTagData>(path);
foreach(var movieTag in tagData) // Further processing example
...
}
Source code
using System;
using System.IO;
using System.Linq;
using System.Xml.Serialization;
using CuttingEdge.Conditions;
/// <summary> Provides methods to serialize
/// and deserialize objects easily on the the disk. </summary>
public static class ObjectXmlSerializer
{
/// <summary> Serializes the specified serializeble object. </summary>
/// <param name="serializebleObject">The serializeble object.</param>
/// <param name="path">The path.</param>
public static void Serialize(object serializebleObject, string path)
{
Condition.Requires(serializebleObject, "serializebleObject").IsNotNull();
Condition.Requires(path, "path").IsNotNullOrEmpty();
ValidateObjectIsSerializable(serializebleObject);
WriteObjectToDisk(serializebleObject, path);
}
private static void WriteObjectToDisk(object serializebleObject, string path)
{
var serializableType = new XmlSerializer(serializebleObject.GetType());
using(var fileWriter = new StreamWriter(path))
{
serializableType.Serialize(fileWriter, serializebleObject);
fileWriter.Close();
}
}
private static void ValidateObjectIsSerializable(object serializebleObject)
{
var expectedAttributes = serializebleObject.GetType()
.GetCustomAttributes(typeof(SerializableAttribute), true);
if(expectedAttributes.Count() == 0)
{
throw new InvalidOperationException(
"Object must be decorated with a 'SerializableAttribute' attribute.");
}
}
/// <summary> Deserializes the specified path. </summary>
/// <typeparam name="T"> Typeof serializable object </typeparam>
/// <param name="path">The path.</param>
/// <returns> An instance according to the specified type of object. </returns>
public static T Deserialize<T>(string path)
{
Condition.Requires(path, "path").IsNotNullOrEmpty();
using(var fileReader = new StreamReader(path))
{
var objectDeserializer = new XmlSerializer(typeof(T));
return (T)objectDeserializer.Deserialize(fileReader);
}
}
}
No comments:
Post a Comment