using JT809.Protocol.Extensions; using JT809.Protocol.Formatters; using JT809.Protocol.Interfaces; using JT809.Protocol.Internal; using JT809.Protocol.MessagePack; using System; using System.Buffers; using System.Collections.Generic; using System.Text; namespace JT809.Protocol { /// /// /// ref:https://adamsitnik.com/Array-Pool/ /// public class JT809Serializer { private readonly IJT809Config jT809Config; private static readonly JT809Package jT809Package = new JT809Package(); private static readonly JT809HeaderPackage jT809HeaderPackage = new JT809HeaderPackage(); public JT809Serializer(IJT809Config jT809Config) { this.jT809Config = jT809Config; } public JT809Serializer():this(new DefaultGlobalConfig()) { } public string SerializerId => jT809Config.ConfigId; public byte[] Serialize(JT809Package jT809Package, int minBufferSize = 4096) { byte[] buffer = JT809ArrayPool.Rent(minBufferSize); try { JT809MessagePackWriter jT809MessagePackWriter = new JT809MessagePackWriter(buffer); jT809Package.Serialize(ref jT809MessagePackWriter,jT809Package, jT809Config); return jT809MessagePackWriter.FlushAndGetEncodingArray(); } finally { JT809ArrayPool.Return(buffer); } } public JT809Package Deserialize(ReadOnlySpan bytes, int minBufferSize = 4096) { byte[] buffer = JT809ArrayPool.Rent(minBufferSize); try { JT809MessagePackReader jT809MessagePackReader = new JT809MessagePackReader(bytes); jT809MessagePackReader.Decode(buffer); return jT809Package.Deserialize(ref jT809MessagePackReader, jT809Config); } finally { JT809ArrayPool.Return(buffer); } } private static bool CheckPackageType(Type type) { return type == typeof(JT809Package) || type == typeof(JT809HeaderPackage); } public byte[] Serialize(T obj,int minBufferSize = 4096) { byte[] buffer = JT809ArrayPool.Rent(minBufferSize); try { JT809MessagePackWriter jT809MessagePackWriter = new JT809MessagePackWriter(buffer); JT809MessagePackFormatterExtensions.GetMessagePackFormatter(jT809Config).Serialize(ref jT809MessagePackWriter, obj,jT809Config); return jT809MessagePackWriter.FlushAndGetEncodingArray(); } finally { JT809ArrayPool.Return(buffer); } } public T Deserialize(ReadOnlySpan bytes, int minBufferSize = 4096) { byte[] buffer = JT809ArrayPool.Rent(minBufferSize); try { JT809MessagePackReader jT809MessagePackReader = new JT809MessagePackReader(bytes); if (CheckPackageType(typeof(T))) jT809MessagePackReader.Decode(buffer); return JT809MessagePackFormatterExtensions.GetMessagePackFormatter(jT809Config).Deserialize(ref jT809MessagePackReader, jT809Config); } finally { JT809ArrayPool.Return(buffer); } } public JT809HeaderPackage HeaderDeserialize(ReadOnlySpan bytes, int minBufferSize = 4096) { byte[] buffer = JT809ArrayPool.Rent(minBufferSize); try { JT809MessagePackReader jT808MessagePackReader = new JT809MessagePackReader(bytes); jT808MessagePackReader.Decode(buffer); return jT809HeaderPackage.Deserialize(ref jT808MessagePackReader, jT809Config); } finally { JT809ArrayPool.Return(buffer); } } } }