Serialization.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics.CodeAnalysis;
  4. using System.IO;
  5. using System.Threading;
  6. using InABox.Clients;
  7. using JetBrains.Annotations;
  8. using Newtonsoft.Json;
  9. namespace InABox.Core
  10. {
  11. public interface ISerializeBinary
  12. {
  13. public void SerializeBinary(BinaryWriter writer);
  14. public void DeserializeBinary(BinaryReader reader);
  15. }
  16. public static class Serialization
  17. {
  18. private static JsonSerializerSettings? _serializerSettings;
  19. private static JsonSerializerSettings SerializerSettings(bool indented = true)
  20. {
  21. if (_serializerSettings == null)
  22. {
  23. _serializerSettings = new JsonSerializerSettings
  24. {
  25. DateParseHandling = DateParseHandling.DateTime,
  26. DateFormatHandling = DateFormatHandling.IsoDateFormat,
  27. DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
  28. };
  29. _serializerSettings.Converters.Add(new DataTableJsonConverter());
  30. //serializerSettings.Converters.Add(new DateTimeJsonConverter());
  31. _serializerSettings.Converters.Add(new FilterJsonConverter());
  32. _serializerSettings.Converters.Add(new ColumnJsonConverter());
  33. _serializerSettings.Converters.Add(new SortOrderJsonConverter());
  34. _serializerSettings.Converters.Add(new UserPropertiesJsonConverter());
  35. }
  36. _serializerSettings.Formatting = indented ? Formatting.Indented : Formatting.None;
  37. return _serializerSettings;
  38. }
  39. public static string Serialize(object? o, bool indented = false)
  40. {
  41. var json = JsonConvert.SerializeObject(o, SerializerSettings(indented));
  42. return json;
  43. }
  44. public static void Serialize(object o, Stream stream, bool indented = false)
  45. {
  46. var settings = SerializerSettings(indented);
  47. using (var sw = new StreamWriter(stream))
  48. {
  49. using (JsonWriter writer = new JsonTextWriter(sw))
  50. {
  51. var serializer = JsonSerializer.Create(settings);
  52. serializer.Serialize(writer, o);
  53. }
  54. }
  55. }
  56. public static void DeserializeInto(string json, object target)
  57. {
  58. JsonConvert.PopulateObject(json, target, SerializerSettings());
  59. }
  60. [return: MaybeNull]
  61. public static T Deserialize<T>(Stream? stream, bool strict = false)
  62. {
  63. if (stream == null)
  64. return default;
  65. try
  66. {
  67. var settings = SerializerSettings();
  68. using var sr = new StreamReader(stream);
  69. using JsonReader reader = new JsonTextReader(sr);
  70. var serializer = JsonSerializer.Create(settings);
  71. return serializer.Deserialize<T>(reader);
  72. }
  73. catch (Exception e)
  74. {
  75. if (strict)
  76. throw;
  77. Logger.Send(LogType.Error, ClientFactory.UserID, $"Error in Deserialize<{typeof(T)}>(): {e.Message}");
  78. return default;
  79. }
  80. }
  81. public static object? Deserialize(Type type, Stream? stream)
  82. {
  83. if (stream == null)
  84. return null;
  85. object? result = null;
  86. var settings = SerializerSettings();
  87. using (var sr = new StreamReader(stream))
  88. {
  89. using (JsonReader reader = new JsonTextReader(sr))
  90. {
  91. var serializer = JsonSerializer.Create(settings);
  92. result = serializer.Deserialize(reader, type);
  93. }
  94. }
  95. return result;
  96. }
  97. [return: MaybeNull]
  98. public static T Deserialize<T>(string? json, bool strict = false) // where T : new()
  99. {
  100. var ret = default(T);
  101. if (string.IsNullOrWhiteSpace(json))
  102. return ret;
  103. try
  104. {
  105. var settings = SerializerSettings();
  106. //if (typeof(T).IsSubclassOf(typeof(BaseObject)))
  107. //{
  108. // ret = Activator.CreateInstance<T>();
  109. // (ret as BaseObject).SetObserving(false);
  110. // JsonConvert.PopulateObject(json, ret, settings);
  111. // (ret as BaseObject).SetObserving(true);
  112. //}
  113. //else
  114. if (typeof(T).IsArray)
  115. {
  116. object o = Array.CreateInstance(typeof(T).GetElementType(), 0);
  117. ret = (T)o;
  118. }
  119. else
  120. {
  121. ret = JsonConvert.DeserializeObject<T>(json, settings);
  122. }
  123. }
  124. catch (Exception)
  125. {
  126. if (strict)
  127. {
  128. throw;
  129. }
  130. ret = Activator.CreateInstance<T>();
  131. }
  132. return ret;
  133. }
  134. public static object? Deserialize(Type T, string json) // where T : new()
  135. {
  136. var ret = T.GetDefault();
  137. if (string.IsNullOrWhiteSpace(json))
  138. return ret;
  139. try
  140. {
  141. var settings = SerializerSettings();
  142. //if (typeof(T).IsSubclassOf(typeof(BaseObject)))
  143. //{
  144. // ret = Activator.CreateInstance<T>();
  145. // (ret as BaseObject).SetObserving(false);
  146. // JsonConvert.PopulateObject(json, ret, settings);
  147. // (ret as BaseObject).SetObserving(true);
  148. //}
  149. //else
  150. if (T.IsArray)
  151. {
  152. object o = Array.CreateInstance(T.GetElementType(), 0);
  153. ret = o;
  154. }
  155. else
  156. {
  157. ret = JsonConvert.DeserializeObject(json, T, settings);
  158. }
  159. }
  160. catch (Exception)
  161. {
  162. ret = Activator.CreateInstance(T);
  163. }
  164. return ret;
  165. }
  166. #region Binary Serialization
  167. public static byte[] WriteBinary(this ISerializeBinary obj)
  168. {
  169. using var stream = new MemoryStream();
  170. obj.SerializeBinary(new BinaryWriter(stream));
  171. return stream.ToArray();
  172. }
  173. public static T ReadBinary<T>(byte[] data)
  174. where T : ISerializeBinary, new() => (T)ReadBinary(typeof(T), data);
  175. public static T ReadBinary<T>(Stream stream)
  176. where T : ISerializeBinary, new() => (T)ReadBinary(typeof(T), stream);
  177. public static object ReadBinary(Type T, byte[] data)
  178. {
  179. using var stream = new MemoryStream(data);
  180. return ReadBinary(T, stream);
  181. }
  182. public static object ReadBinary(Type T, Stream stream)
  183. {
  184. var obj = (Activator.CreateInstance(T) as ISerializeBinary)!;
  185. obj.DeserializeBinary(new BinaryReader(stream));
  186. return obj;
  187. }
  188. #endregion
  189. }
  190. }