Created
November 29, 2024 13:43
-
-
Save leandromoh/3670b14a439fa55879c3c0a66a7d5883 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <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