Serialization.cs 6.0 KB

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