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);
}
}
}
}