You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
4.0 KiB

  1. using JT809.Protocol.Extensions;
  2. using JT809.Protocol.Formatters;
  3. using JT809.Protocol.Interfaces;
  4. using JT809.Protocol.Internal;
  5. using JT809.Protocol.MessagePack;
  6. using System;
  7. using System.Buffers;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. namespace JT809.Protocol
  11. {
  12. /// <summary>
  13. ///
  14. /// ref:https://adamsitnik.com/Array-Pool/
  15. /// </summary>
  16. public class JT809Serializer
  17. {
  18. private readonly IJT809Config jT809Config;
  19. private static readonly JT809Package jT809Package = new JT809Package();
  20. private static readonly JT809HeaderPackage jT809HeaderPackage = new JT809HeaderPackage();
  21. public JT809Serializer(IJT809Config jT809Config)
  22. {
  23. this.jT809Config = jT809Config;
  24. }
  25. public JT809Serializer():this(new DefaultGlobalConfig())
  26. {
  27. }
  28. public string SerializerId => jT809Config.ConfigId;
  29. public byte[] Serialize(JT809Package jT809Package, int minBufferSize = 4096)
  30. {
  31. byte[] buffer = JT809ArrayPool.Rent(minBufferSize);
  32. try
  33. {
  34. JT809MessagePackWriter jT809MessagePackWriter = new JT809MessagePackWriter(buffer);
  35. jT809Package.Serialize(ref jT809MessagePackWriter,jT809Package, jT809Config);
  36. return jT809MessagePackWriter.FlushAndGetEncodingArray();
  37. }
  38. finally
  39. {
  40. JT809ArrayPool.Return(buffer);
  41. }
  42. }
  43. public JT809Package Deserialize(ReadOnlySpan<byte> bytes, int minBufferSize = 4096)
  44. {
  45. byte[] buffer = JT809ArrayPool.Rent(minBufferSize);
  46. try
  47. {
  48. JT809MessagePackReader jT809MessagePackReader = new JT809MessagePackReader(bytes);
  49. jT809MessagePackReader.Decode(buffer);
  50. return jT809Package.Deserialize(ref jT809MessagePackReader, jT809Config);
  51. }
  52. finally
  53. {
  54. JT809ArrayPool.Return(buffer);
  55. }
  56. }
  57. private static bool CheckPackageType(Type type)
  58. {
  59. return type == typeof(JT809Package) || type == typeof(JT809HeaderPackage);
  60. }
  61. public byte[] Serialize<T>(T obj,int minBufferSize = 4096)
  62. {
  63. byte[] buffer = JT809ArrayPool.Rent(minBufferSize);
  64. try
  65. {
  66. JT809MessagePackWriter jT809MessagePackWriter = new JT809MessagePackWriter(buffer);
  67. JT809MessagePackFormatterExtensions.GetMessagePackFormatter<T>(jT809Config).Serialize(ref jT809MessagePackWriter, obj,jT809Config);
  68. return jT809MessagePackWriter.FlushAndGetEncodingArray();
  69. }
  70. finally
  71. {
  72. JT809ArrayPool.Return(buffer);
  73. }
  74. }
  75. public T Deserialize<T>(ReadOnlySpan<byte> bytes, int minBufferSize = 4096)
  76. {
  77. byte[] buffer = JT809ArrayPool.Rent(minBufferSize);
  78. try
  79. {
  80. JT809MessagePackReader jT809MessagePackReader = new JT809MessagePackReader(bytes);
  81. if (CheckPackageType(typeof(T)))
  82. jT809MessagePackReader.Decode(buffer);
  83. return JT809MessagePackFormatterExtensions.GetMessagePackFormatter<T>(jT809Config).Deserialize(ref jT809MessagePackReader, jT809Config);
  84. }
  85. finally
  86. {
  87. JT809ArrayPool.Return(buffer);
  88. }
  89. }
  90. public JT809HeaderPackage HeaderDeserialize(ReadOnlySpan<byte> bytes, int minBufferSize = 4096)
  91. {
  92. byte[] buffer = JT809ArrayPool.Rent(minBufferSize);
  93. try
  94. {
  95. JT809MessagePackReader jT808MessagePackReader = new JT809MessagePackReader(bytes);
  96. jT808MessagePackReader.Decode(buffer);
  97. return jT809HeaderPackage.Deserialize(ref jT808MessagePackReader, jT809Config);
  98. }
  99. finally
  100. {
  101. JT809ArrayPool.Return(buffer);
  102. }
  103. }
  104. }
  105. }