using System.Collections;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Diagnostics.CodeAnalysis;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public static partial class SerializationExtensions
public static RecyclableMemoryStreamManager Manager { get; } = new RecyclableMemoryStreamManager(
new RecyclableMemoryStreamManager.Options
public static partial class SerializationExtensions
[return: NotNullIfNotNull(nameof(value))]
public static T? CloneWithMessagePack<T>(this T? value, MessagePackSerializerOptions? options = default)
using Stream stream = Manager.GetStream();
MessagePackSerializer.Serialize(stream, value, options);
return MessagePackSerializer.Deserialize<T>(stream, options)!;
public static partial class SerializationExtensions
static JsonSerializerSettings NewtonsoftCloneOptions { get; } = new()
Formatting = Formatting.None,
NullValueHandling = NullValueHandling.Ignore,
DefaultValueHandling = DefaultValueHandling.Ignore,
DateParseHandling = DateParseHandling.None,
[return: NotNullIfNotNull(nameof(value))]
public static T? CloneWithNewtonsoft<T>(this T? value, JsonSerializerSettings? settings = default)
var serializer = JsonSerializer.CreateDefault(settings ?? NewtonsoftCloneOptions);
return JToken.FromObject(value, serializer).ToObject<T?>(serializer)!;
public List<string> Strings { get; set; } = new();
public Dictionary<string, string> Dictionary { get; set; } = new();
public static T? DestroyReference<T>(T data) => data.CloneWithMessagePack();
public static void Test()
foreach (var model in GetModels())
TestWithMessagePack(model);
TestWithNewtonsoft(model);
public static IEnumerable<Model> GetModels() =>
Strings = { "a", "b", "c", "d" },
static void TestWithNewtonsoft(Model model)
var newModel = model.CloneWithNewtonsoft();
Assert.That(model.Strings.SequenceEqual(newModel.Strings));
Assert.That(model.Dictionary.SequenceEqual(newModel.Dictionary));
Console.WriteLine(JsonConvert.SerializeObject(newModel));
static void TestWithMessagePack(Model model)
var newModel = model.CloneWithMessagePack();
Assert.That(model.Strings.SequenceEqual(newModel.Strings));
Assert.That(model.Dictionary.SequenceEqual(newModel.Dictionary));
Console.WriteLine(JsonConvert.SerializeObject(newModel));
public static void Main()
Console.WriteLine("Environment version: {0} ({1}), {2}", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion);
Console.WriteLine("{0} version: {1}", typeof(JsonSerializer).Namespace, typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");