Skip to content

Instantly share code, notes, and snippets.

@leandromoh
Created November 29, 2024 13:43
Show Gist options
  • Save leandromoh/3670b14a439fa55879c3c0a66a7d5883 to your computer and use it in GitHub Desktop.
Save leandromoh/3670b14a439fa55879c3c0a66a7d5883 to your computer and use it in GitHub Desktop.
/// <summary>
/// Perform a Deep Copy of the object, using Json as a serialization method.
/// NOTE: Private members are not cloned using this method.
/// </summary>
/// <typeparam name="T">The type of object being copied.</typeparam>
/// <param name="source">The object instance to copy.</param>
/// <returns>The Deep Copied Object.</returns>
public static T DeepCopy<T>(this T source)
{
if (source is null)
return default;
// initialize inner objects individually
// for example in default constructor some list property initialized with some values,
// but in 'source' these items are cleaned -
// without ObjectCreationHandling.Replace default constructor values will be added to result
var serializeSettings = new JsonSerializerSettings
{
FloatParseHandling = FloatParseHandling.Decimal,
ObjectCreationHandling = ObjectCreationHandling.Replace,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
TypeNameHandling = TypeNameHandling.All
};
var serializer = JsonSerializer.Create(serializeSettings);
using var stream = new MemoryStream();
SerializeInto(stream, serializer, source);
var copy = DeserializeFrom(stream, serializer);
return copy;
static void SerializeInto(Stream stream, JsonSerializer serializer, T source)
{
using var textWriter = new StreamWriter(stream, leaveOpen: true);
using var jsonWriter = new JsonTextWriter(textWriter);
serializer.Serialize(jsonWriter, source);
jsonWriter.Flush();
stream.Position = 0;
}
static T DeserializeFrom(Stream stream, JsonSerializer serializer)
{
using var textReader = new StreamReader(stream);
using var jsonReader = new JsonTextReader(textReader);
return serializer.Deserialize<T>(jsonReader);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment