65.9K
CodeProject is changing. Read more.
Home

Serialize and deserialize generic arrays

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2 votes)

Dec 28, 2011

CPOL
viewsIcon

33279

Code to serialize and deserialize generic arrays.

We often use things like Configuration[] configs and like to manage that in an XML file that we can edit. Two simple extension methods can help you here.

public static string SerializeArray(this T[] list)
{
    System.Xml.XmlDocument doc = new XmlDocument();
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(list.GetType());
    System.IO.MemoryStream stream = new System.IO.MemoryStream();

    try
    {
        serializer.Serialize(stream, list);
        stream.Position = 0;
        doc.Load(stream);
        return doc.InnerXml;
    }
    catch { throw; }
    finally
    {
        stream.Close();
        stream.Dispose();
    }
}

public static T[] DeSerializeArray(string serializedData)
{
    T[] list = null;
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T[]));
    XmlReader xReader = XmlReader.Create(new StringReader(serializedData));

    try
    {
        list = (T[])serializer.Deserialize(xReader);
    }
    catch
    {
        throw;
    }
    finally
    {
        xReader.Close();
    }

    return list;
}

Code to serialize the data:

string xml1 = _environments.SerializeArray();
StreamWriter writer = new StreamWriter("config.xml");
writer.Write(xml1);
writer.Close();

To deserialize the data:

string xml = File.ReadAllText("config.xml");
_environments = Extensions.DeSerializeArray(xml);

If you don't like the root ArrayOfConfiguration, you can change the extension methods to use a XmlRootAttribute like:

XmlRootAttribute root = new XmlRootAttribute(rootName);
System.Xml.Serialization.XmlSerializer serializer = 
   ew System.Xml.Serialization.XmlSerializer(typeof(T[]), root);

You need to use the matching name in both methods to get it working.