using Neo.Afx.Utilities; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using System.Xml.Serialization; namespace Neo.Afx.Common { /// /// Serialization Utilities /// public static class SerializationUtilities { static Newtonsoft.Json.JsonSerializer JsonSerializer; #region Serialize /// /// Serialize /// /// obj /// byte[] public static byte[] Serialize(object obj) { if (obj.GetType() == typeof(XElement)) { return SerializeXElement(obj); } else { return SerializeJson(obj); } } #endregion #region Deserialize /// /// Deserialize /// public static T Deserialize(byte[] stream) { if (typeof(T) == typeof(XElement)) { return DerializeXElement(stream); } else { return DeserializeJson(stream); } } #endregion #region Json Serialization static byte[] SerializeJson(object o) { if (JsonSerializer == null) { var settings = new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Error, DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc, StringEscapeHandling = Newtonsoft.Json.StringEscapeHandling.EscapeHtml }; JsonSerializer = Newtonsoft.Json.JsonSerializer.Create(settings); } var json = ""; using (var sw = new StringWriter()) { JsonSerializer.Serialize(sw, o); json = sw.ToString(); } return StringUtilities.StringToByteArray(json); } static T DeserializeJson(byte[] stream) { return (T)Newtonsoft.Json.JsonConvert.DeserializeObject(StringUtilities.ByteArrayToString(stream), typeof(T)); } #endregion #region Binary Serialization static byte[] SerializeBinary(object o) { if (o == null) { return null; } BinaryFormatter binaryFormatter = new BinaryFormatter(); try { using (MemoryStream memoryStream = new MemoryStream()) { binaryFormatter.Serialize(memoryStream, o); byte[] objectDataAsStream = memoryStream.ToArray(); return objectDataAsStream; } } catch (Exception) { return null; } } static T DeserializeBinary(byte[] stream) { if (stream == null) { return default(T); } BinaryFormatter binaryFormatter = new BinaryFormatter(); using (MemoryStream memoryStream = new MemoryStream(stream)) { T result = (T)binaryFormatter.Deserialize(memoryStream); return result; } } #endregion #region XmlSerialization static byte[] SerializeXElement(object obj) { using (var memoryStream = new MemoryStream()) { using (TextWriter streamWriter = new StreamWriter(memoryStream)) { var xmlSerializer = new XmlSerializer(typeof(XElement)); xmlSerializer.Serialize(streamWriter, obj); return memoryStream.ToArray(); } } } static T DerializeXElement(byte[] stream) { if (stream == null) { return default(T); } var xs = new XmlSerializer(typeof(XElement)); using (MemoryStream memoryStream = new MemoryStream(stream)) { return (T)xs.Deserialize(memoryStream); } } #endregion } }