Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

239 рядки
11 KiB

  1. using JT808.Protocol.Enums;
  2. using JT808.Protocol.Extensions;
  3. using JT808.Protocol.Formatters;
  4. using JT808.Protocol.Interfaces;
  5. using JT808.Protocol.Internal;
  6. using JT808.Protocol.MessagePack;
  7. using System;
  8. using System.IO;
  9. using System.Text;
  10. using System.Text.Json;
  11. namespace JT808.Protocol
  12. {
  13. public class JT808CarDVRSerializer
  14. {
  15. public readonly static JT808CarDVRUpPackage JT808CarDVRUpPackage = new JT808CarDVRUpPackage();
  16. public readonly static JT808CarDVRDownPackage JT808CarDVRDownPackage = new JT808CarDVRDownPackage();
  17. public JT808CarDVRSerializer(IJT808Config jT808Config)
  18. {
  19. this.jT808Config = jT808Config;
  20. }
  21. public JT808CarDVRSerializer():this(new DefaultGlobalConfig())
  22. {
  23. }
  24. public string SerializerId => jT808Config.ConfigId;
  25. private readonly IJT808Config jT808Config;
  26. public byte[] Serialize(JT808CarDVRUpPackage package, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096)
  27. {
  28. byte[] buffer = JT808ArrayPool.Rent(minBufferSize);
  29. try
  30. {
  31. JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version);
  32. package.Serialize(ref jT808MessagePackWriter, package, jT808Config);
  33. return jT808MessagePackWriter.FlushAndGetEncodingArray();
  34. }
  35. finally
  36. {
  37. JT808ArrayPool.Return(buffer);
  38. }
  39. }
  40. public ReadOnlySpan<byte> SerializeReadOnlySpan(JT808CarDVRUpPackage package, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096)
  41. {
  42. byte[] buffer = JT808ArrayPool.Rent(minBufferSize);
  43. try
  44. {
  45. JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version);
  46. package.Serialize(ref jT808MessagePackWriter, package, jT808Config);
  47. return jT808MessagePackWriter.FlushAndGetEncodingReadOnlySpan();
  48. }
  49. finally
  50. {
  51. JT808ArrayPool.Return(buffer);
  52. }
  53. }
  54. public byte[] Serialize(JT808CarDVRDownPackage package, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096)
  55. {
  56. byte[] buffer = JT808ArrayPool.Rent(minBufferSize);
  57. try
  58. {
  59. JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version);
  60. package.Serialize(ref jT808MessagePackWriter, package, jT808Config);
  61. return jT808MessagePackWriter.FlushAndGetEncodingArray();
  62. }
  63. finally
  64. {
  65. JT808ArrayPool.Return(buffer);
  66. }
  67. }
  68. public ReadOnlySpan<byte> SerializeReadOnlySpan(JT808CarDVRDownPackage package, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096)
  69. {
  70. byte[] buffer = JT808ArrayPool.Rent(minBufferSize);
  71. try
  72. {
  73. JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version);
  74. package.Serialize(ref jT808MessagePackWriter, package, jT808Config);
  75. return jT808MessagePackWriter.FlushAndGetEncodingReadOnlySpan();
  76. }
  77. finally
  78. {
  79. JT808ArrayPool.Return(buffer);
  80. }
  81. }
  82. public JT808CarDVRUpPackage UpDeserialize(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013)
  83. {
  84. JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);
  85. return JT808CarDVRUpPackage.Deserialize(ref jT808MessagePackReader, jT808Config);
  86. }
  87. public JT808CarDVRDownPackage DownDeserialize(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013)
  88. {
  89. JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);
  90. return JT808CarDVRDownPackage.Deserialize(ref jT808MessagePackReader, jT808Config);
  91. }
  92. public byte [] Serialize<T>(T obj, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096)
  93. {
  94. byte[] buffer = JT808ArrayPool.Rent(minBufferSize);
  95. try
  96. {
  97. var formatter = jT808Config.GetMessagePackFormatter<T>();
  98. JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version);
  99. formatter.Serialize(ref jT808MessagePackWriter, obj, jT808Config);
  100. return jT808MessagePackWriter.FlushAndGetEncodingArray();
  101. }
  102. finally
  103. {
  104. JT808ArrayPool.Return(buffer);
  105. }
  106. }
  107. public ReadOnlySpan<byte> SerializeReadOnlySpan<T>(T obj, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096)
  108. {
  109. byte[] buffer = JT808ArrayPool.Rent(minBufferSize);
  110. try
  111. {
  112. var formatter = jT808Config.GetMessagePackFormatter<T>();
  113. JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version);
  114. formatter.Serialize(ref jT808MessagePackWriter, obj, jT808Config);
  115. return jT808MessagePackWriter.FlushAndGetEncodingReadOnlySpan();
  116. }
  117. finally
  118. {
  119. JT808ArrayPool.Return(buffer);
  120. }
  121. }
  122. public T Deserialize<T>(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013)
  123. {
  124. JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);
  125. var formatter = jT808Config.GetMessagePackFormatter<T>();
  126. return formatter.Deserialize(ref jT808MessagePackReader, jT808Config);
  127. }
  128. public dynamic Deserialize(ReadOnlySpan<byte> bytes, Type type, JT808Version version = JT808Version.JTT2013)
  129. {
  130. var formatter = jT808Config.GetMessagePackFormatterByType(type);
  131. JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);
  132. return JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(formatter,ref jT808MessagePackReader, jT808Config);
  133. }
  134. public string UpAnalyze(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default)
  135. {
  136. JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);
  137. using(MemoryStream memoryStream = new MemoryStream())
  138. using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options))
  139. {
  140. JT808CarDVRUpPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config);
  141. utf8JsonWriter.Flush();
  142. string value = Encoding.UTF8.GetString(memoryStream.ToArray());
  143. return value;
  144. }
  145. }
  146. public string DownAnalyze(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default)
  147. {
  148. JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);
  149. using (MemoryStream memoryStream = new MemoryStream())
  150. using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options))
  151. {
  152. JT808CarDVRDownPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config);
  153. utf8JsonWriter.Flush();
  154. string value = Encoding.UTF8.GetString(memoryStream.ToArray());
  155. return value;
  156. }
  157. }
  158. public string Analyze<T>(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default)
  159. {
  160. JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);
  161. var analyze = jT808Config.GetAnalyze<T>();
  162. using (MemoryStream memoryStream = new MemoryStream())
  163. using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options))
  164. {
  165. if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteStartObject();
  166. analyze.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config);
  167. if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteEndObject();
  168. utf8JsonWriter.Flush();
  169. string value = Encoding.UTF8.GetString(memoryStream.ToArray());
  170. return value;
  171. }
  172. }
  173. public byte[] UpAnalyzeJsonBuffer(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default)
  174. {
  175. JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);
  176. using (MemoryStream memoryStream = new MemoryStream())
  177. using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options))
  178. {
  179. JT808CarDVRUpPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config);
  180. utf8JsonWriter.Flush();
  181. return memoryStream.ToArray();
  182. }
  183. }
  184. public byte[] DownAnalyzeJsonBuffer(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default)
  185. {
  186. JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);
  187. using (MemoryStream memoryStream = new MemoryStream())
  188. using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options))
  189. {
  190. JT808CarDVRDownPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config);
  191. utf8JsonWriter.Flush();
  192. return memoryStream.ToArray();
  193. }
  194. }
  195. public byte[] AnalyzeJsonBuffer<T>(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default)
  196. {
  197. JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);
  198. var analyze = jT808Config.GetAnalyze<T>();
  199. using (MemoryStream memoryStream = new MemoryStream())
  200. using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options))
  201. {
  202. if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteStartObject();
  203. analyze.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config);
  204. if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteEndObject();
  205. utf8JsonWriter.Flush();
  206. return memoryStream.ToArray();
  207. }
  208. }
  209. private static bool CheckPackageType(Type type)
  210. {
  211. return type == typeof(JT808CarDVRUpPackage) || type == typeof(JT808CarDVRDownPackage);
  212. }
  213. }
  214. }