From e1b34c85a088a5d9796468ff64c5310d625a2d9e Mon Sep 17 00:00:00 2001 From: Artur Stolear Date: Sun, 8 Feb 2026 12:40:16 +0100 Subject: [PATCH] refactor(serializer): utilize source-generated JSON context for serialization Replaces manual `JsonSerializerOptions` configuration with source-generated `VersionVariablesJsonContext` for improved maintainability and performance. Removes obsolete private `JsonSerializerOptions` method and integrates the generated context in JSON methods. --- .../Serializer/VersionVariableSerializer.cs | 10 ++-------- .../Serializer/VersionVariablesJsonContext.cs | 18 ++++++++++++++++++ .../VersionVariablesJsonStringConverter.cs | 6 ++++++ 3 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 src/GitVersion.Output/Serializer/VersionVariablesJsonContext.cs diff --git a/src/GitVersion.Output/Serializer/VersionVariableSerializer.cs b/src/GitVersion.Output/Serializer/VersionVariableSerializer.cs index eb5c7fc536..af5c40bbc6 100644 --- a/src/GitVersion.Output/Serializer/VersionVariableSerializer.cs +++ b/src/GitVersion.Output/Serializer/VersionVariableSerializer.cs @@ -1,5 +1,4 @@ using System.IO.Abstractions; -using System.Text.Encodings.Web; using GitVersion.Extensions; using GitVersion.Helpers; @@ -9,8 +8,7 @@ internal class VersionVariableSerializer(IFileSystem fileSystem) : IVersionVaria { public static GitVersionVariables FromJson(string json) { - var serializeOptions = JsonSerializerOptions(); - var variablePairs = JsonSerializer.Deserialize>(json, serializeOptions); + var variablePairs = JsonSerializer.Deserialize(json, VersionVariablesJsonContext.Custom.DictionaryStringString); return FromDictionary(variablePairs); } @@ -25,9 +23,7 @@ public string ToJson(GitVersionVariables gitVersionVariables) propertyInfo?.SetValue(variables, ChangeType(value, propertyInfo.PropertyType)); } - var serializeOptions = JsonSerializerOptions(); - - return JsonSerializer.Serialize(variables, serializeOptions); + return JsonSerializer.Serialize(variables, VersionVariablesJsonContext.Custom.VersionVariablesJsonModel); } public GitVersionVariables FromFile(string filePath) @@ -94,8 +90,6 @@ private void ToFileInternal(GitVersionVariables gitVersionVariables, string file fileSystem.File.WriteAllText(filePath, json); } - private static JsonSerializerOptions JsonSerializerOptions() => new() { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, Converters = { new VersionVariablesJsonStringConverter() } }; - private static object? ChangeType(object? value, Type type) { if (!type.IsGenericType || type.GetGenericTypeDefinition() != typeof(Nullable<>)) return Convert.ChangeType(value, type); diff --git a/src/GitVersion.Output/Serializer/VersionVariablesJsonContext.cs b/src/GitVersion.Output/Serializer/VersionVariablesJsonContext.cs new file mode 100644 index 0000000000..7eda33dbe8 --- /dev/null +++ b/src/GitVersion.Output/Serializer/VersionVariablesJsonContext.cs @@ -0,0 +1,18 @@ +using System.Text.Encodings.Web; + +namespace GitVersion.OutputVariables; + +[JsonSourceGenerationOptions( + WriteIndented = true, + DefaultIgnoreCondition = JsonIgnoreCondition.Never, + Converters = [typeof(VersionVariablesJsonStringConverter)])] +[JsonSerializable(typeof(VersionVariablesJsonModel))] +[JsonSerializable(typeof(Dictionary))] +internal partial class VersionVariablesJsonContext : JsonSerializerContext +{ + public static VersionVariablesJsonContext Custom => field ??= new VersionVariablesJsonContext( + new JsonSerializerOptions(Default.Options) + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }); +} diff --git a/src/GitVersion.Output/Serializer/VersionVariablesJsonStringConverter.cs b/src/GitVersion.Output/Serializer/VersionVariablesJsonStringConverter.cs index 236853f11d..814d6561ab 100644 --- a/src/GitVersion.Output/Serializer/VersionVariablesJsonStringConverter.cs +++ b/src/GitVersion.Output/Serializer/VersionVariablesJsonStringConverter.cs @@ -31,5 +31,11 @@ public override void Write(Utf8JsonWriter writer, string? value, JsonSerializerO writer.WriteStringValue(value); } + public override string ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + => reader.GetString() ?? ""; + + public override void WriteAsPropertyName(Utf8JsonWriter writer, string value, JsonSerializerOptions options) + => writer.WritePropertyName(value); + public override bool HandleNull => true; }