// Copyright (c) Arlo Godfrey. All Rights Reserved. // Licensed under the GNU Lesser General Public License, Version 3.0 with additional terms. // See the LICENSE, LICENSE.LESSER and LICENSE.ADDITIONAL files in the project root for more information. using System; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json; using OwlCore.Extensions; using OwlCore.Services; namespace StrixMusic.Sdk.Services { /// /// An and implementation for serializing and deserializing streams using System.Text.Json. /// public class NewtonsoftStreamSerializer : IAsyncSerializer, ISerializer { /// /// A singleton instance for . /// public static NewtonsoftStreamSerializer Singleton { get; } = new(); /// public Task SerializeAsync(T data, CancellationToken? cancellationToken = null) => Task.Run(() => Serialize(data), cancellationToken ?? CancellationToken.None); /// public Task SerializeAsync(Type inputType, object data, CancellationToken? cancellationToken = null) => Task.Run(() => Serialize(inputType, data), cancellationToken ?? CancellationToken.None); /// public Task DeserializeAsync(Stream serialized, CancellationToken? cancellationToken = null) => Task.Run(() => Deserialize(serialized), cancellationToken ?? CancellationToken.None); /// public Task DeserializeAsync(Type returnType, Stream serialized, CancellationToken? cancellationToken = null) => Task.Run(() => Deserialize(returnType, serialized), cancellationToken ?? CancellationToken.None); /// public Stream Serialize(T data) { var res = JsonConvert.SerializeObject(data, typeof(T), null); return new MemoryStream(Encoding.UTF8.GetBytes(res)); } /// public Stream Serialize(Type type, object data) { var res = JsonConvert.SerializeObject(data, type, null); return new MemoryStream(Encoding.UTF8.GetBytes(res)); } /// public TResult Deserialize(Stream serialized) { serialized.Position = 0; var str = Encoding.UTF8.GetString(serialized.ToBytes()); return (TResult)JsonConvert.DeserializeObject(str, typeof(TResult))!; } /// public object Deserialize(Type type, Stream serialized) { serialized.Position = 0; var str = Encoding.UTF8.GetString(serialized.ToBytes()); return JsonConvert.DeserializeObject(str, type)!; } } }