Skip to content

Commit 30e2563

Browse files
committed
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.
1 parent f430ff6 commit 30e2563

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

src/GitVersion.Output/Serializer/VersionVariableSerializer.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.IO.Abstractions;
2-
using System.Text.Encodings.Web;
32
using GitVersion.Extensions;
43
using GitVersion.Helpers;
54

@@ -9,8 +8,7 @@ internal class VersionVariableSerializer(IFileSystem fileSystem) : IVersionVaria
98
{
109
public static GitVersionVariables FromJson(string json)
1110
{
12-
var serializeOptions = JsonSerializerOptions();
13-
var variablePairs = JsonSerializer.Deserialize<Dictionary<string, string>>(json, serializeOptions);
11+
var variablePairs = JsonSerializer.Deserialize(json, VersionVariablesJsonContext.Custom.DictionaryStringString);
1412
return FromDictionary(variablePairs);
1513
}
1614

@@ -25,9 +23,7 @@ public string ToJson(GitVersionVariables gitVersionVariables)
2523
propertyInfo?.SetValue(variables, ChangeType(value, propertyInfo.PropertyType));
2624
}
2725

28-
var serializeOptions = JsonSerializerOptions();
29-
30-
return JsonSerializer.Serialize(variables, serializeOptions);
26+
return JsonSerializer.Serialize(variables, VersionVariablesJsonContext.Custom.VersionVariablesJsonModel);
3127
}
3228

3329
public GitVersionVariables FromFile(string filePath)
@@ -94,8 +90,6 @@ private void ToFileInternal(GitVersionVariables gitVersionVariables, string file
9490
fileSystem.File.WriteAllText(filePath, json);
9591
}
9692

97-
private static JsonSerializerOptions JsonSerializerOptions() => new() { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, Converters = { new VersionVariablesJsonStringConverter() } };
98-
9993
private static object? ChangeType(object? value, Type type)
10094
{
10195
if (!type.IsGenericType || type.GetGenericTypeDefinition() != typeof(Nullable<>)) return Convert.ChangeType(value, type);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System.Text.Encodings.Web;
2+
3+
namespace GitVersion.OutputVariables;
4+
5+
[JsonSourceGenerationOptions(
6+
WriteIndented = true,
7+
DefaultIgnoreCondition = JsonIgnoreCondition.Never,
8+
Converters = [typeof(VersionVariablesJsonStringConverter)])]
9+
[JsonSerializable(typeof(VersionVariablesJsonModel))]
10+
[JsonSerializable(typeof(Dictionary<string, string>))]
11+
internal partial class VersionVariablesJsonContext : JsonSerializerContext
12+
{
13+
public static VersionVariablesJsonContext Custom => field ??= new VersionVariablesJsonContext(
14+
new JsonSerializerOptions(Default.Options)
15+
{
16+
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
17+
});
18+
}

src/GitVersion.Output/Serializer/VersionVariablesJsonStringConverter.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,11 @@ public override void Write(Utf8JsonWriter writer, string? value, JsonSerializerO
3131
writer.WriteStringValue(value);
3232
}
3333

34+
public override string ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
35+
=> reader.GetString() ?? "";
36+
37+
public override void WriteAsPropertyName(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
38+
=> writer.WritePropertyName(value);
39+
3440
public override bool HandleNull => true;
3541
}

0 commit comments

Comments
 (0)