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.

114 rivejä
3.8 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. public JT809Serializer(IJT809Config jT809Config)
  20. {
  21. this.jT809Config = jT809Config;
  22. }
  23. public JT809Serializer():this(new DefaultGlobalConfig())
  24. {
  25. }
  26. public string SerializerId => jT809Config.ConfigId;
  27. public byte[] Serialize(JT809Package jT809Package, int minBufferSize = 4096)
  28. {
  29. byte[] buffer = JT809ArrayPool.Rent(minBufferSize);
  30. try
  31. {
  32. JT809MessagePackWriter jT809MessagePackWriter = new JT809MessagePackWriter(buffer);
  33. JT809PackageFormatter.Instance.Serialize(ref jT809MessagePackWriter,jT809Package, jT809Config);
  34. return jT809MessagePackWriter.FlushAndGetEncodingArray();
  35. }
  36. finally
  37. {
  38. JT809ArrayPool.Return(buffer);
  39. }
  40. }
  41. public JT809Package Deserialize(ReadOnlySpan<byte> bytes, int minBufferSize = 4096)
  42. {
  43. byte[] buffer = JT809ArrayPool.Rent(minBufferSize);
  44. try
  45. {
  46. JT809MessagePackReader jT809MessagePackReader = new JT809MessagePackReader(bytes);
  47. jT809MessagePackReader.Decode(buffer);
  48. return JT809PackageFormatter.Instance.Deserialize(ref jT809MessagePackReader, jT809Config);
  49. }
  50. finally
  51. {
  52. JT809ArrayPool.Return(buffer);
  53. }
  54. }
  55. private static bool CheckPackageType(Type type)
  56. {
  57. return type == typeof(JT809Package) || type == typeof(JT809HeaderPackage);
  58. }
  59. public byte[] Serialize<T>(T obj,int minBufferSize = 4096)
  60. {
  61. byte[] buffer = JT809ArrayPool.Rent(minBufferSize);
  62. try
  63. {
  64. JT809MessagePackWriter jT809MessagePackWriter = new JT809MessagePackWriter(buffer);
  65. JT809MessagePackFormatterExtensions.GetFormatter<T>().Serialize(ref jT809MessagePackWriter, obj,jT809Config);
  66. return jT809MessagePackWriter.FlushAndGetEncodingArray();
  67. }
  68. finally
  69. {
  70. JT809ArrayPool.Return(buffer);
  71. }
  72. }
  73. public T Deserialize<T>(ReadOnlySpan<byte> bytes, int minBufferSize = 4096)
  74. {
  75. byte[] buffer = JT809ArrayPool.Rent(minBufferSize);
  76. try
  77. {
  78. JT809MessagePackReader jT809MessagePackReader = new JT809MessagePackReader(bytes);
  79. if (CheckPackageType(typeof(T)))
  80. jT809MessagePackReader.Decode(buffer);
  81. return JT809MessagePackFormatterExtensions.GetFormatter<T>().Deserialize(ref jT809MessagePackReader, jT809Config);
  82. }
  83. finally
  84. {
  85. JT809ArrayPool.Return(buffer);
  86. }
  87. }
  88. public JT809HeaderPackage HeaderDeserialize(ReadOnlySpan<byte> bytes, int minBufferSize = 4096)
  89. {
  90. byte[] buffer = JT809ArrayPool.Rent(minBufferSize);
  91. try
  92. {
  93. JT809MessagePackReader jT808MessagePackReader = new JT809MessagePackReader(bytes);
  94. jT808MessagePackReader.Decode(buffer);
  95. return JT809HeaderPackageFormatter.Instance.Deserialize(ref jT808MessagePackReader, jT809Config);
  96. }
  97. finally
  98. {
  99. JT809ArrayPool.Return(buffer);
  100. }
  101. }
  102. }
  103. }