[ACCEPTED]-C# - Deserialize a List<String>-extension-methods

Accepted answer
Score: 19

There is no such builtin method as SerializeObject 2 but it's not terribly difficult to code 1 one up.

public void SerializeObject(this List<string> list, string fileName) {
  var serializer = new XmlSerializer(typeof(List<string>));
  using ( var stream = File.OpenWrite(fileName)) {
    serializer.Serialize(stream, list);
  }
}

And Deserialize

public void Deserialize(this List<string> list, string fileName) {
  var serializer = new XmlSerializer(typeof(List<string>));
  using ( var stream = File.OpenRead(fileName) ){
    var other = (List<string>)(serializer.Deserialize(stream));
    list.Clear();
    list.AddRange(other);
  }
}
Score: 4

These are my serialize/deserialize extension 6 methods that work quite well

public static class SerializationExtensions
{
    public static XElement Serialize(this object source)
    {
        try
        {
            var serializer = XmlSerializerFactory.GetSerializerFor(source.GetType());
            var xdoc = new XDocument();
            using (var writer = xdoc.CreateWriter())
            {
                serializer.Serialize(writer, source, new XmlSerializerNamespaces(new[] { new XmlQualifiedName("", "") }));
            }

            return (xdoc.Document != null) ? xdoc.Document.Root : new XElement("Error", "Document Missing");
        }
        catch (Exception x)
        {
            return new XElement("Error", x.ToString());
        }
    }

    public static T Deserialize<T>(this XElement source) where T : class
    {
        try
        {
            var serializer = XmlSerializerFactory.GetSerializerFor(typeof(T));

            return (T)serializer.Deserialize(source.CreateReader());
        }
        catch //(Exception x)
        {
            return null;
        }
    }
}

public static class XmlSerializerFactory
{
    private static Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>();

    public static XmlSerializer GetSerializerFor(Type typeOfT)
    {
        if (!serializers.ContainsKey(typeOfT))
        {
            System.Diagnostics.Debug.WriteLine(string.Format("XmlSerializerFactory.GetSerializerFor(typeof({0}));", typeOfT));

            var newSerializer = new XmlSerializer(typeOfT);
            serializers.Add(typeOfT, newSerializer);
        }

        return serializers[typeOfT];
    }
}

You just need 5 to define a type for your list and use it 4 instead

public class StringList : List<String> { }

Oh, and you don't NEED the XmlSerializerFactory, it's 3 just there since creating a serializer is 2 slow, and if you use the same one over and 1 over this speeds up your app.

Score: 1

I'm not sure whether this will help you 9 but I have dome something which I believe 8 to be similar to you.

//A list that holds my data
private List<Location> locationCollection = new List<Location>();


public bool Load()
{
            //For debug purposes
            Console.WriteLine("Loading Data");

            XmlSerializer serializer = new XmlSerializer(typeof(List<Location>));
            FileStream fs = new FileStream("CurrencyData.xml", FileMode.Open);

            locationCollection = (List<Location>)serializer.Deserialize(fs);

            fs.Close();

            Console.WriteLine("Data Loaded");
            return true;
}

This allows me to deserialise 7 all my data back into a List<> but i'd 6 advise putting it in a try - catch block 5 for safety. In fact just looking at this 4 now is going to make me rewrite this in 3 a "using" block too.

I hope this helps.

EDIT:

Apologies, just 2 noticed you're trying to do it a different 1 way but i'll leave my answer there anyway.

Score: 0

I was getting error while deserializing 4 to object. The error was "There is an error in XML document (0, 0)". I have modified 3 the Deserialize function originally written 2 by @JaredPar to resolve this error. It may 1 be useful to someone:

public static void Deserialize(this List<string> list, string fileName)
{
    XmlRootAttribute xmlRoot = new XmlRootAttribute();
    xmlRoot.ElementName = "YourRootElementName";
    xmlRoot.IsNullable = true;

    var serializer = new XmlSerializer(typeof(List<string>), xmlRoot);
    using (var stream = File.OpenRead(fileName))
    {
        var other = (List<string>)(serializer.Deserialize(stream));
        list.Clear();
        list.AddRange(other);
    }
}
Score: 0

Create a list of products be serialized

List<string> Products = new List<string>
{
  new string("Product 1"),
  new string("Product 2"),
  new string("Product 3"),
  new string("Product 4")
};

Serialization

using (FileStream fs = new FileStream(@"C:\products.txt", FileMode.Create))
{
   BinaryFormatter bf = new BinaryFormatter();
   bf.Serialize(fs, Products);
}

Deserialization

using (FileStream fs = new FileStream(@"C:\products.txt", FileMode.Open))
{
    BinaryFormatter bf = new BinaryFormatter();
    var productList = (List<string>)bf.Deserialize(fs);
}

0

More Related questions