mirror of
https://github.com/ICDSystems/ICD.Common.Utils.git
synced 2026-02-16 05:05:05 +00:00
perf: Reduced size of JSON serialized nullable types
This commit is contained in:
@@ -155,6 +155,13 @@ namespace ICD.Common.Utils.Tests.Extensions
|
|||||||
Assert.AreEqual(expected, type.GetNameWithoutGenericArity());
|
Assert.AreEqual(expected, type.GetNameWithoutGenericArity());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestCase(typeof(int), "System.Int32, System.Private.CoreLib")]
|
||||||
|
[TestCase(typeof(int?), "System.Nullable`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib")]
|
||||||
|
public void GetNameWithoutAssemblyDetailsTest(Type type, string expected)
|
||||||
|
{
|
||||||
|
Assert.AreEqual(expected, type.GetNameWithoutAssemblyDetails());
|
||||||
|
}
|
||||||
|
|
||||||
[TestCase(typeof(string), "string")]
|
[TestCase(typeof(string), "string")]
|
||||||
[TestCase(typeof(int?), "int?")]
|
[TestCase(typeof(int?), "int?")]
|
||||||
[TestCase(typeof(List<int?>), "List<int?>")]
|
[TestCase(typeof(List<int?>), "List<int?>")]
|
||||||
|
|||||||
@@ -7,6 +7,16 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
{
|
{
|
||||||
public static class JsonWriterExtensions
|
public static class JsonWriterExtensions
|
||||||
{
|
{
|
||||||
|
private static readonly Dictionary<Type, string> s_TypeToString;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Static constructor.
|
||||||
|
/// </summary>
|
||||||
|
static JsonWriterExtensions()
|
||||||
|
{
|
||||||
|
s_TypeToString = new Dictionary<Type, string>();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Writes the type value.
|
/// Writes the type value.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -24,9 +34,22 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string name = Type.GetType(type.FullName) == null
|
string name;
|
||||||
? type.GetNameWithoutAssemblyDetails()
|
if (!s_TypeToString.TryGetValue(type, out name))
|
||||||
: type.FullName;
|
{
|
||||||
|
// We'll use the full name if it can be deserialized.
|
||||||
|
// Full name ends up longer than name without assembly details when
|
||||||
|
// using nullables, so we do a length check to get the smallest possible
|
||||||
|
// string representation for the type.
|
||||||
|
string fullName = Type.GetType(type.FullName) == null ? null : type.FullName;
|
||||||
|
string nameWithoutAssembly = type.GetNameWithoutAssemblyDetails();
|
||||||
|
|
||||||
|
name = fullName == null || fullName.Length > nameWithoutAssembly.Length
|
||||||
|
? nameWithoutAssembly
|
||||||
|
: fullName;
|
||||||
|
|
||||||
|
s_TypeToString.Add(type, name);
|
||||||
|
}
|
||||||
|
|
||||||
extends.WriteValue(name);
|
extends.WriteValue(name);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user