using JT808.Protocol.Enums; using JT808.Protocol.Extensions; using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.Internal; using JT808.Protocol.MessagePack; using System; using System.IO; using System.Text; using System.Text.Json; namespace JT808.Protocol { public class JT808CarDVRSerializer { public readonly static JT808CarDVRUpPackage JT808CarDVRUpPackage = new JT808CarDVRUpPackage(); public readonly static JT808CarDVRDownPackage JT808CarDVRDownPackage = new JT808CarDVRDownPackage(); public JT808CarDVRSerializer(IJT808Config jT808Config) { this.jT808Config = jT808Config; } public JT808CarDVRSerializer():this(new DefaultGlobalConfig()) { } public string SerializerId => jT808Config.ConfigId; private readonly IJT808Config jT808Config; public byte[] Serialize(JT808CarDVRUpPackage package, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version); package.Serialize(ref jT808MessagePackWriter, package, jT808Config); return jT808MessagePackWriter.FlushAndGetEncodingArray(); } finally { JT808ArrayPool.Return(buffer); } } public ReadOnlySpan SerializeReadOnlySpan(JT808CarDVRUpPackage package, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version); package.Serialize(ref jT808MessagePackWriter, package, jT808Config); return jT808MessagePackWriter.FlushAndGetEncodingReadOnlySpan(); } finally { JT808ArrayPool.Return(buffer); } } public byte[] Serialize(JT808CarDVRDownPackage package, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version); package.Serialize(ref jT808MessagePackWriter, package, jT808Config); return jT808MessagePackWriter.FlushAndGetEncodingArray(); } finally { JT808ArrayPool.Return(buffer); } } public ReadOnlySpan SerializeReadOnlySpan(JT808CarDVRDownPackage package, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version); package.Serialize(ref jT808MessagePackWriter, package, jT808Config); return jT808MessagePackWriter.FlushAndGetEncodingReadOnlySpan(); } finally { JT808ArrayPool.Return(buffer); } } public JT808CarDVRUpPackage UpDeserialize(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013) { JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); return JT808CarDVRUpPackage.Deserialize(ref jT808MessagePackReader, jT808Config); } public JT808CarDVRDownPackage DownDeserialize(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013) { JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); return JT808CarDVRDownPackage.Deserialize(ref jT808MessagePackReader, jT808Config); } public byte [] Serialize(T obj, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { var formatter = jT808Config.GetMessagePackFormatter(); JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version); formatter.Serialize(ref jT808MessagePackWriter, obj, jT808Config); return jT808MessagePackWriter.FlushAndGetEncodingArray(); } finally { JT808ArrayPool.Return(buffer); } } public ReadOnlySpan SerializeReadOnlySpan(T obj, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { var formatter = jT808Config.GetMessagePackFormatter(); JT808MessagePackWriter jT808MessagePackWriter = new JT808MessagePackWriter(buffer, version); formatter.Serialize(ref jT808MessagePackWriter, obj, jT808Config); return jT808MessagePackWriter.FlushAndGetEncodingReadOnlySpan(); } finally { JT808ArrayPool.Return(buffer); } } public T Deserialize(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013) { JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); var formatter = jT808Config.GetMessagePackFormatter(); return formatter.Deserialize(ref jT808MessagePackReader, jT808Config); } public dynamic Deserialize(ReadOnlySpan bytes, Type type, JT808Version version = JT808Version.JTT2013) { var formatter = jT808Config.GetMessagePackFormatterByType(type); JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); return JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(formatter,ref jT808MessagePackReader, jT808Config); } public string UpAnalyze(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default) { JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); using(MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { JT808CarDVRUpPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); utf8JsonWriter.Flush(); string value = Encoding.UTF8.GetString(memoryStream.ToArray()); return value; } } public string DownAnalyze(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default) { JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); using (MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { JT808CarDVRDownPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); utf8JsonWriter.Flush(); string value = Encoding.UTF8.GetString(memoryStream.ToArray()); return value; } } public string Analyze(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default) { JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); var analyze = jT808Config.GetAnalyze(); using (MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteStartObject(); analyze.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteEndObject(); utf8JsonWriter.Flush(); string value = Encoding.UTF8.GetString(memoryStream.ToArray()); return value; } } public byte[] UpAnalyzeJsonBuffer(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default) { JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); using (MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { JT808CarDVRUpPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); utf8JsonWriter.Flush(); return memoryStream.ToArray(); } } public byte[] DownAnalyzeJsonBuffer(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default) { JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); using (MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { JT808CarDVRDownPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); utf8JsonWriter.Flush(); return memoryStream.ToArray(); } } public byte[] AnalyzeJsonBuffer(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default) { JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); var analyze = jT808Config.GetAnalyze(); using (MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteStartObject(); analyze.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteEndObject(); utf8JsonWriter.Flush(); return memoryStream.ToArray(); } } private static bool CheckPackageType(Type type) { return type == typeof(JT808CarDVRUpPackage) || type == typeof(JT808CarDVRDownPackage); } } }