Advertisement
mr_robd_lon_1

SO_PreserveReferencesHandling_E

Sep 18th, 2014
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.31 KB | None | 0 0
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Concurrent;
  4. using System.IO;
  5. using System.Xml.Serialization;
  6.  
  7. namespace Contracts.Helpers
  8. {
  9.     public static class SerialisationHelper
  10.     {
  11.         #region Member Variables
  12.  
  13.         private readonly static ConcurrentDictionary<Type, XmlSerializer> _xmlSerialiser;
  14.         private readonly static JsonSerializerSettings _jsonSettings;
  15.  
  16.         #endregion
  17.  
  18.         #region Constructors
  19.  
  20.         /// <summary>
  21.         /// Initialises the static instance of the <see cref="SerialisationHelper"/> class.
  22.         /// </summary>
  23.         static SerialisationHelper()
  24.         {
  25.             _xmlSerialiser = new ConcurrentDictionary<Type, XmlSerializer>();
  26.             _jsonSettings = new JsonSerializerSettings()
  27.             {
  28.                 TypeNameHandling = TypeNameHandling.Auto,
  29.                 ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
  30.                 PreserveReferencesHandling = PreserveReferencesHandling.Objects,
  31.                 ObjectCreationHandling = ObjectCreationHandling.Auto
  32.             };
  33.         }
  34.  
  35.         #endregion
  36.  
  37.         #region Methods
  38.  
  39.         /// <summary>
  40.         /// Serialises an object.
  41.         /// </summary>
  42.         /// <param name="objectToSerialise">Object to serialise.</param>
  43.         /// <param name="serialiseAsJson">True if to serialise as JSON, otherwise will serialise as XML.</param>
  44.         /// <returns></returns>
  45.         public static string Serialise(object objectToSerialise, bool serialiseAsJson = true)
  46.         {
  47.             string result = null;
  48.             if (serialiseAsJson)
  49.             {                
  50.                 result = JsonConvert.SerializeObject(objectToSerialise, Formatting.Indented, _jsonSettings);
  51.             }
  52.             else
  53.             {
  54.                 using (var writer = new StringWriter())
  55.                 {
  56.                     XmlSerializer serialiser = GetXmlSerialiser(objectToSerialise.GetType());
  57.                     serialiser.Serialize(writer, objectToSerialise);
  58.                     result = writer.ToString();
  59.                 }
  60.             }
  61.  
  62.             return result;
  63.         }
  64.  
  65.         /// <summary>
  66.         /// Deserialises an object.
  67.         /// </summary>
  68.         /// <param name="serialisedObject">Object to deserialise</param>
  69.         /// <param name="deserialiseFromJson">True if to deserialise from JSON, otherwise will deserialise from XML.</param>
  70.         /// <returns></returns>
  71.         public static TResult Deserialise<TResult>(string serialisedObject, bool deserialiseFromJson = true) where TResult : class
  72.         {
  73.             TResult result = null;
  74.             if (deserialiseFromJson)
  75.             {
  76.                 try
  77.                 {
  78.                     result = JsonConvert.DeserializeObject<TResult>(serialisedObject, _jsonSettings);
  79.                 }
  80.                 catch(JsonSerializationException)
  81.                 {
  82.                     result = null;
  83.                 }
  84.                 catch (JsonReaderException)
  85.                 {
  86.                     result = null;
  87.                 }
  88.             }
  89.             else
  90.             {
  91.                 XmlSerializer serialiser = GetXmlSerialiser(typeof(TResult));
  92.                 using (var reader = new StringReader(serialisedObject))
  93.                 {
  94.                     try
  95.                     {
  96.                         result = serialiser.Deserialize(reader) as TResult;
  97.                     }
  98.                     catch (InvalidOperationException)
  99.                     {
  100.                         result = null;
  101.                     }
  102.                 }
  103.             }
  104.  
  105.             return result;
  106.         }
  107.  
  108.         /// <summary>
  109.         /// Gets an XML Serialiser instance for handling the given object type.
  110.         /// </summary>
  111.         /// <param name="objectType"></param>
  112.         /// <returns></returns>
  113.         private static XmlSerializer GetXmlSerialiser(Type objectType)
  114.         {
  115.             XmlSerializer result = null;
  116.             _xmlSerialiser.TryGetValue(objectType, out result);
  117.             if (result == null)
  118.             {
  119.                 result = _xmlSerialiser.AddOrUpdate(objectType, new XmlSerializer(objectType), (ot, s) => s);
  120.             }
  121.  
  122.             return result;
  123.         }
  124.  
  125.         #endregion
  126.     }
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement