Serialization.cs 6.0 KB

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