Extension Methods – Serialize/Deserialize as Json/XML

Yan Cui

I help clients go faster for less using serverless technologies.

Cranked these out last night, hope you find it useful too Smile

   1: public static class SerializationExtensions

   2: {

   3:     private static readonly ConcurrentDictionary<Type, XmlSerializer> XmlSerializers =

   4:         new ConcurrentDictionary<Type, XmlSerializer>();

   5:

   6:     private static readonly ConcurrentDictionary<Type, DataContractJsonSerializer> JsonSerializers =

   7:         new ConcurrentDictionary<Type, DataContractJsonSerializer>();

   8:

   9:     private static readonly JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer();

  10:

  11:     public enum JsonSerializerType

  12:     {

  13:         Undefined = 0,

  14:

  15:         DataContractJsonSerializer = 1,

  16:

  17:         JavaScriptSerializer = 2

  18:     }

  19:

  20:     /// <summary>

  21:     /// Serializes the object using XML format.

  22:     /// </summary>

  23:     public static string SerializeAsXml(this object obj)

  24:     {

  25:         var type = obj.GetType();

  26:         var xmlSerializer = GetXmlSerializer(type);

  27:

  28:         using (var memStream = new MemoryStream())

  29:         {

  30:             xmlSerializer.Serialize(memStream, obj);

  31:             return Encoding.Default.GetString(memStream.ToArray());

  32:         }

  33:     }

  34:

  35:     /// <summary>

  36:     /// Serializes the object using JSON format, either using the default 

  37:     /// DataContractJsonSerializer or the JavaScriptSerializer, the results

  38:     /// differ slightly.

  39:     /// </summary>

  40:     public static string SerializeAsJson(

  41:         this object obj,

  42:         JsonSerializerType serializerType = JsonSerializerType.DataContractJsonSerializer)

  43:     {

  44:         switch (serializerType)

  45:         {

  46:             case JsonSerializerType.JavaScriptSerializer:

  47:                 return JavaScriptSerializer.Serialize(obj);

  48:             case JsonSerializerType.DataContractJsonSerializer:

  49:             default:

  50:                 var type = obj.GetType();

  51:                 var serializer = GetJsonSerializer(type);

  52:

  53:                 using (var memStream = new MemoryStream())

  54:                 {

  55:                     serializer.WriteObject(memStream, obj);

  56:                     return Encoding.Default.GetString(memStream.ToArray());

  57:                 }

  58:         }

  59:     }

  60:

  61:     /// <summary>

  62:     /// Deserializes the specified XML string to an object of the specified type T.

  63:     /// </summary>

  64:     public static T DeserializeAsXml<T>(this string xmlString)

  65:     {

  66:         var xmlSerializer = GetXmlSerializer(typeof(T));

  67:         using (var memStream = new MemoryStream(Encoding.Default.GetBytes(xmlString)))

  68:         {

  69:             return (T)xmlSerializer.Deserialize(memStream);

  70:         }

  71:     }

  72:

  73:     /// <summary>

  74:     /// Deserializes the specified JSON string to an object of the specified type T.

  75:     /// </summary>

  76:     public static T DeserializeAsJson<T>(

  77:         this string jsonString,

  78:         JsonSerializerType serializerType = JsonSerializerType.DataContractJsonSerializer)

  79:     {

  80:         switch (serializerType)

  81:         {

  82:             case JsonSerializerType.JavaScriptSerializer:

  83:                 return JavaScriptSerializer.Deserialize<T>(jsonString);

  84:             case JsonSerializerType.DataContractJsonSerializer:

  85:             default:

  86:                 var serializer = GetJsonSerializer(typeof(T));

  87:

  88:                 using (var memStream = new MemoryStream(Encoding.Default.GetBytes(jsonString)))

  89:                 {

  90:                     return (T)serializer.ReadObject(memStream);

  91:                 }

  92:         }

  93:     }

  94:

  95:     private static XmlSerializer GetXmlSerializer(Type type)

  96:     {

  97:         // gets the xml serializer from the concurrent dictionary, if it doesn't exist

  98:         // then add one for the specified type

  99:         return XmlSerializers.GetOrAdd(type, t => new XmlSerializer(t));

 100:     }

 101:

 102:     private static DataContractJsonSerializer GetJsonSerializer(Type type)

 103:     {

 104:         // gets the json serializer from the concurrent dictionary, if it doesn't exist

 105:         // then add one for the specified type

 106:         return JsonSerializers.GetOrAdd(type, t => new DataContractJsonSerializer(t));

 107:     }

 108: }


Whenever you’re ready, here are 3 ways I can help you:

  1. Production-Ready Serverless: Join 20+ AWS Heroes & Community Builders and 1000+ other students in levelling up your serverless game.
  2. Consulting: If you want to improve feature velocity, reduce costs, and make your systems more scalable, secure, and resilient, then let’s work together and make it happen.
  3. Join my FREE Community on Skool, where you can ask for help, share your success stories and hang out with me and other like-minded people without all the negativity from social media.

 

Leave a Comment

Your email address will not be published. Required fields are marked *