Skip to main content
Removing superfluous caching, as per slolife's find on MSDN
Source Link
Greg
  • 23.4k
  • 11
  • 61
  • 80
private static readonly Dictionary<Type, XmlSerializer> _serializers = new Dictionary<Type, XmlSerializer>();

/// <summary>Serializes an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="objectToSerialize">Objectname="obj">Object to serialize</param>
/// <returns>A string that represents Xml, empty otherwise</returns>
public static string XmlSerialize<T>(this T objectToSerializeobj) where T : class, new()
{
    if (objectToSerializeobj == null) throw new ArgumentNullException("objectToSerialize");

    Type type = typeof(T"obj");
    XmlSerializer serializer;

    if (!_serializers.TryGetValue(type, out serializer))
    {
       var serializer = new XmlSerializer(type);
        _serializers.Addtypeof(type, serializerT));
    }

    using (var writer = new StringWriter())
    {
        serializer.Serialize(writer, objectToSerializeobj);
        return writer.ToString();
    }
}

/// <summary>Deserializes an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialize from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialize<T>(this string xml) where T : class, new()
{
    if (xml == null) throw new ArgumentNullException("xml");

    Type type = typeof(T);
    XmlSerializer serializer;

    if (!_serializers.TryGetValue(type, out serializer))
    {
       var serializer = new XmlSerializer(type);
        _serializers.Addtypeof(type, serializerT));
    }

    using (var reader = new StringReader(xml))
    {
        try { return (T)serializer.Deserialize(reader); }
        catch { return null; } // Could not be deserialized to this type.
    }
}

Note that this code is not threadsafe. To make it threadsafe

  • Add locks around the calls to the _serializers dictionary, or
  • Add the [ThreadStatic] attribute to the _serializers field, and check if _serializers needs to be instantiated before calling TryGetValue(), or
  • Get rid of the dictionary all together and instantiate a new instance of XmlSerializer on each call.
private static readonly Dictionary<Type, XmlSerializer> _serializers = new Dictionary<Type, XmlSerializer>();

/// <summary>Serializes an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="objectToSerialize">Object to serialize</param>
/// <returns>A string that represents Xml, empty otherwise</returns>
public static string XmlSerialize<T>(this T objectToSerialize) where T : class, new()
{
    if (objectToSerialize == null) throw new ArgumentNullException("objectToSerialize");

    Type type = typeof(T);
    XmlSerializer serializer;

    if (!_serializers.TryGetValue(type, out serializer))
    {
        serializer = new XmlSerializer(type);
        _serializers.Add(type, serializer);
    }

    using (var writer = new StringWriter())
    {
        serializer.Serialize(writer, objectToSerialize);
        return writer.ToString();
    }
}

/// <summary>Deserializes an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialize from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialize<T>(this string xml) where T : class, new()
{
    if (xml == null) throw new ArgumentNullException("xml");

    Type type = typeof(T);
    XmlSerializer serializer;

    if (!_serializers.TryGetValue(type, out serializer))
    {
        serializer = new XmlSerializer(type);
        _serializers.Add(type, serializer);
    }

    using (var reader = new StringReader(xml))
    {
        try { return (T)serializer.Deserialize(reader); }
        catch { return null; } // Could not be deserialized to this type.
    }
}

Note that this code is not threadsafe. To make it threadsafe

  • Add locks around the calls to the _serializers dictionary, or
  • Add the [ThreadStatic] attribute to the _serializers field, and check if _serializers needs to be instantiated before calling TryGetValue(), or
  • Get rid of the dictionary all together and instantiate a new instance of XmlSerializer on each call.
/// <summary>Serializes an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="obj">Object to serialize</param>
/// <returns>A string that represents Xml, empty otherwise</returns>
public static string XmlSerialize<T>(this T obj) where T : class, new()
{
    if (obj == null) throw new ArgumentNullException("obj");

    var serializer = new XmlSerializer(typeof(T));
    using (var writer = new StringWriter())
    {
        serializer.Serialize(writer, obj);
        return writer.ToString();
    }
}

/// <summary>Deserializes an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialize from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialize<T>(this string xml) where T : class, new()
{
    if (xml == null) throw new ArgumentNullException("xml");

    var serializer = new XmlSerializer(typeof(T));
    using (var reader = new StringReader(xml))
    {
        try { return (T)serializer.Deserialize(reader); }
        catch { return null; } // Could not be deserialized to this type.
    }
}
Corrected spelling, code cleanup, add null param check, add notes about thread safety; added 111 characters in body
Source Link
Greg
  • 23.4k
  • 11
  • 61
  • 80

SerialisingSerializing / DeserialisingDeserializing objects to XmlXML:

private static readonly Dictionary<Type, XmlSerializer> serialisers_serializers = new Dictionary<Type, XmlSerializer>();

/// <summary>Serialises<summary>Serializes an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="objectToSerialise">Objectname="objectToSerialize">Object to serialise<serialize</param>
/// <returns>A string that represents Xml, empty oterwise<otherwise</returns>
public static string XmlSerialise<T>XmlSerialize<T>(this T objectToSerialiseobjectToSerialize) where T : class, new()
{
  XmlSerializer serialiser; if (objectToSerialize == null) throw new ArgumentNullException("objectToSerialize");

  var  Type type = typeof(T);
    XmlSerializer serializer;

    if (!serialisers_serializers.ContainsKeyTryGetValue(type, out serializer))
    {
    serialiser    serializer = new XmlSerializer(type);
    serialisers    _serializers.Add(type, serialiserserializer);
  }
  else
  {
    serialiser = serialisers[type];
  }

  string xml;
  using (var writer = new StringWriter())
    {
    serialiser    serializer.Serialize(writer, objectToSerialiseobjectToSerialize);
    xml =   return writer.ToString();
  }

  return xml;}
}

/// <summary>Deserialises<summary>Deserializes an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialisedeserialize from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialise<T>XmlDeserialize<T>(this string xml) where T : class, new()
{
  XmlSerializer serialiser; if (xml == null) throw new ArgumentNullException("xml");

  var  Type type = typeof(T);
    XmlSerializer serializer;

    if (!serialisers_serializers.ContainsKeyTryGetValue(type, out serializer))
    {
    serialiser    serializer = new XmlSerializer(type);
    serialisers    _serializers.Add(type, serialiserserializer);
  }
  else
  {
    serialiser = serialisers[type];
  }

  T newObject;

  using (var reader = new StringReader(xml))
    {
        try { newObject =return (T)serialiserserializer.Deserialize(reader); }
        catch { return null; } // Could not be deserialized to this type.
  }

  return newObject;}
}

When building the serialisation I had a help from an online example - but cannot remeber where itNote that this code is.. not threadsafe. To make it threadsafe

  • Add locks around the calls to the _serializers dictionary, or
  • Add the [ThreadStatic] attribute to the _serializers field, and check if _serializers needs to be instantiated before calling TryGetValue(), or
  • Get rid of the dictionary all together and instantiate a new instance of XmlSerializer on each call.

Serialising / Deserialising objects to Xml:

private static readonly Dictionary<Type, XmlSerializer> serialisers = new Dictionary<Type, XmlSerializer>();

/// <summary>Serialises an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="objectToSerialise">Object to serialise</param>
/// <returns>A string that represents Xml, empty oterwise</returns>
public static string XmlSerialise<T>(this T objectToSerialise) where T : class, new()
{
  XmlSerializer serialiser;

  var type = typeof(T);
  if (!serialisers.ContainsKey(type))
  {
    serialiser = new XmlSerializer(type);
    serialisers.Add(type, serialiser);
  }
  else
  {
    serialiser = serialisers[type];
  }

  string xml;
  using (var writer = new StringWriter())
  {
    serialiser.Serialize(writer, objectToSerialise);
    xml = writer.ToString();
  }

  return xml;
}

/// <summary>Deserialises an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialise from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialise<T>(this string xml) where T : class, new()
{
  XmlSerializer serialiser;

  var type = typeof(T);
  if (!serialisers.ContainsKey(type))
  {
    serialiser = new XmlSerializer(type);
    serialisers.Add(type, serialiser);
  }
  else
  {
    serialiser = serialisers[type];
  }

  T newObject;

  using (var reader = new StringReader(xml))
  {
    try { newObject = (T)serialiser.Deserialize(reader); }
    catch { return null; } // Could not be deserialized to this type.
  }

  return newObject;
}

When building the serialisation I had a help from an online example - but cannot remeber where it is...

Serializing / Deserializing objects to XML:

private static readonly Dictionary<Type, XmlSerializer> _serializers = new Dictionary<Type, XmlSerializer>();

/// <summary>Serializes an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="objectToSerialize">Object to serialize</param>
/// <returns>A string that represents Xml, empty otherwise</returns>
public static string XmlSerialize<T>(this T objectToSerialize) where T : class, new()
{
    if (objectToSerialize == null) throw new ArgumentNullException("objectToSerialize");

    Type type = typeof(T);
    XmlSerializer serializer;

    if (!_serializers.TryGetValue(type, out serializer))
    {
        serializer = new XmlSerializer(type);
        _serializers.Add(type, serializer);
    }

    using (var writer = new StringWriter())
    {
        serializer.Serialize(writer, objectToSerialize);
        return writer.ToString();
    }
}

/// <summary>Deserializes an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialize from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialize<T>(this string xml) where T : class, new()
{
    if (xml == null) throw new ArgumentNullException("xml");

    Type type = typeof(T);
    XmlSerializer serializer;

    if (!_serializers.TryGetValue(type, out serializer))
    {
        serializer = new XmlSerializer(type);
        _serializers.Add(type, serializer);
    }

    using (var reader = new StringReader(xml))
    {
        try { return (T)serializer.Deserialize(reader); }
        catch { return null; } // Could not be deserialized to this type.
    }
}

Note that this code is not threadsafe. To make it threadsafe

  • Add locks around the calls to the _serializers dictionary, or
  • Add the [ThreadStatic] attribute to the _serializers field, and check if _serializers needs to be instantiated before calling TryGetValue(), or
  • Get rid of the dictionary all together and instantiate a new instance of XmlSerializer on each call.
put all code in [code] tags
Source Link
edosoft
  • 17.4k
  • 25
  • 81
  • 114

By all means put this in the codeplex project.

Serialising / Deserialising objects to Xml:

private static readonly Dictionary<Type, XmlSerializer> serialisers = new Dictionary<Type, XmlSerializer>();

private static readonly Dictionary<Type, XmlSerializer> serialisers = new Dictionary<Type, XmlSerializer>();

/// <summary>Serialises an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="objectToSerialise">Object to serialise</param>
/// <returns>A string that represents Xml, empty oterwise</returns>
public static string XmlSerialise<T>(this T objectToSerialise) where T : class, new()
{
  XmlSerializer serialiser;

  var type = typeof(T);
  if (!serialisers.ContainsKey(type))
  {
    serialiser = new XmlSerializer(type);
    serialisers.Add(type, serialiser);
  }
  else
  {
    serialiser = serialisers[type];
  }

  string xml;
  using (var writer = new StringWriter())
  {
    serialiser.Serialize(writer, objectToSerialise);
    xml = writer.ToString();
  }

  return xml;
}

/// <summary>Deserialises an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialise from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialise<T>(this string xml) where T : class, new()
{
  XmlSerializer serialiser;

  var type = typeof(T);
  if (!serialisers.ContainsKey(type))
  {
    serialiser = new XmlSerializer(type);
    serialisers.Add(type, serialiser);
  }
  else
  {
    serialiser = serialisers[type];
  }

  T newObject;

  using (var reader = new StringReader(xml))
  {
    try { newObject = (T)serialiser.Deserialize(reader); }
    catch { return null; } // Could not be deserialized to this type.
  }

  return newObject;
}

When building the serialisation I had a help from an online example - but cannot remeber where it is...

By all means put this in the codeplex project.

Serialising / Deserialising objects to Xml:

private static readonly Dictionary<Type, XmlSerializer> serialisers = new Dictionary<Type, XmlSerializer>();

/// <summary>Serialises an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="objectToSerialise">Object to serialise</param>
/// <returns>A string that represents Xml, empty oterwise</returns>
public static string XmlSerialise<T>(this T objectToSerialise) where T : class, new()
{
  XmlSerializer serialiser;

  var type = typeof(T);
  if (!serialisers.ContainsKey(type))
  {
    serialiser = new XmlSerializer(type);
    serialisers.Add(type, serialiser);
  }
  else
  {
    serialiser = serialisers[type];
  }

  string xml;
  using (var writer = new StringWriter())
  {
    serialiser.Serialize(writer, objectToSerialise);
    xml = writer.ToString();
  }

  return xml;
}

/// <summary>Deserialises an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialise from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialise<T>(this string xml) where T : class, new()
{
  XmlSerializer serialiser;

  var type = typeof(T);
  if (!serialisers.ContainsKey(type))
  {
    serialiser = new XmlSerializer(type);
    serialisers.Add(type, serialiser);
  }
  else
  {
    serialiser = serialisers[type];
  }

  T newObject;

  using (var reader = new StringReader(xml))
  {
    try { newObject = (T)serialiser.Deserialize(reader); }
    catch { return null; } // Could not be deserialized to this type.
  }

  return newObject;
}

When building the serialisation I had a help from an online example - but cannot remeber where it is...

By all means put this in the codeplex project.

Serialising / Deserialising objects to Xml:

private static readonly Dictionary<Type, XmlSerializer> serialisers = new Dictionary<Type, XmlSerializer>();

/// <summary>Serialises an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="objectToSerialise">Object to serialise</param>
/// <returns>A string that represents Xml, empty oterwise</returns>
public static string XmlSerialise<T>(this T objectToSerialise) where T : class, new()
{
  XmlSerializer serialiser;

  var type = typeof(T);
  if (!serialisers.ContainsKey(type))
  {
    serialiser = new XmlSerializer(type);
    serialisers.Add(type, serialiser);
  }
  else
  {
    serialiser = serialisers[type];
  }

  string xml;
  using (var writer = new StringWriter())
  {
    serialiser.Serialize(writer, objectToSerialise);
    xml = writer.ToString();
  }

  return xml;
}

/// <summary>Deserialises an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialise from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialise<T>(this string xml) where T : class, new()
{
  XmlSerializer serialiser;

  var type = typeof(T);
  if (!serialisers.ContainsKey(type))
  {
    serialiser = new XmlSerializer(type);
    serialisers.Add(type, serialiser);
  }
  else
  {
    serialiser = serialisers[type];
  }

  T newObject;

  using (var reader = new StringReader(xml))
  {
    try { newObject = (T)serialiser.Deserialize(reader); }
    catch { return null; } // Could not be deserialized to this type.
  }

  return newObject;
}

When building the serialisation I had a help from an online example - but cannot remeber where it is...

Fixed memory leak - hopefully...
Source Link
TWith2Sugars
  • 3.4k
  • 2
  • 29
  • 44
Loading
Rollback to Revision 4
Source Link
TWith2Sugars
  • 3.4k
  • 2
  • 29
  • 44
Loading
Changed XmlDeserialise to not used exception to control logic.
Source Link
TWith2Sugars
  • 3.4k
  • 2
  • 29
  • 44
Loading
Replaced the MemoryStream/XmlReaderWriter with StringReaderWriter
Source Link
Portman
  • 32k
  • 25
  • 84
  • 101
Loading
Added codeplex acceptance
Source Link
TWith2Sugars
  • 3.4k
  • 2
  • 29
  • 44
Loading
Post Made Community Wiki by CommunityBot
added 112 characters in body
Source Link
TWith2Sugars
  • 3.4k
  • 2
  • 29
  • 44
Loading
Source Link
TWith2Sugars
  • 3.4k
  • 2
  • 29
  • 44
Loading