Skip to content

Commit 40458e3

Browse files
committed
fix: lazily create yaml data serializer
1 parent 13df6bc commit 40458e3

2 files changed

Lines changed: 53 additions & 5 deletions

File tree

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System.Reflection;
2+
using Datra.Attributes;
3+
using Datra.Serializers;
4+
using Xunit;
5+
6+
namespace Datra.Tests
7+
{
8+
public class DataSerializerFactoryTests
9+
{
10+
[Fact]
11+
public void JsonContextFactory_DoesNotCreateYamlSerializerForJsonFormat()
12+
{
13+
var factory = new DataSerializerFactory(TestJsonContext.Default);
14+
15+
var serializer = factory.GetSerializer("Units.yaml", DataFormat.Json);
16+
17+
Assert.IsType<SystemTextJsonDataSerializer>(serializer);
18+
Assert.Null(ReadYamlSerializer(factory));
19+
}
20+
21+
[Fact]
22+
public void JsonContextFactory_CreatesYamlSerializerOnlyForYamlFormat()
23+
{
24+
var factory = new DataSerializerFactory(TestJsonContext.Default);
25+
26+
var serializer = factory.GetSerializer("Units.yaml", DataFormat.Yaml);
27+
28+
Assert.IsType<YamlDataSerializer>(serializer);
29+
Assert.Same(serializer, ReadYamlSerializer(factory));
30+
}
31+
32+
private static object? ReadYamlSerializer(DataSerializerFactory factory)
33+
{
34+
var field = typeof(DataSerializerFactory).GetField(
35+
"_yamlSerializer",
36+
BindingFlags.Instance | BindingFlags.NonPublic);
37+
Assert.NotNull(field);
38+
return field!.GetValue(factory);
39+
}
40+
}
41+
}

Datra/Serializers/DataSerializerFactory.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ namespace Datra.Serializers
1717
public class DataSerializerFactory
1818
{
1919
private readonly IDataSerializer _jsonSerializer;
20-
private readonly IDataSerializer _yamlSerializer;
20+
private readonly Func<IDataSerializer> _createYamlSerializer;
21+
private IDataSerializer? _yamlSerializer;
2122

2223
/// <summary>
2324
/// Reflection-mode JSON. Trim/AOT-unsafe — explicit opt-in suitable for tooling/tests.
@@ -29,7 +30,7 @@ public class DataSerializerFactory
2930
public DataSerializerFactory()
3031
{
3132
_jsonSerializer = SystemTextJsonDataSerializer.CreateReflectionUnsafe();
32-
_yamlSerializer = new YamlDataSerializer();
33+
_createYamlSerializer = CreateDefaultYamlSerializer;
3334
}
3435

3536
/// <summary>
@@ -39,7 +40,7 @@ public DataSerializerFactory(JsonSerializerContext jsonContext)
3940
{
4041
if (jsonContext == null) throw new ArgumentNullException(nameof(jsonContext));
4142
_jsonSerializer = new SystemTextJsonDataSerializer(jsonContext);
42-
_yamlSerializer = new YamlDataSerializer();
43+
_createYamlSerializer = CreateDefaultYamlSerializer;
4344
}
4445

4546
#if NET8_0_OR_GREATER
@@ -72,7 +73,7 @@ public DataSerializerFactory(
7273
IEnumerable<Type>? excludedTypes)
7374
{
7475
_jsonSerializer = SystemTextJsonDataSerializer.CreateReflectionUnsafe();
75-
_yamlSerializer = new YamlDataSerializer(polymorphicBaseTypes, customYamlConverters, excludedTypes);
76+
_createYamlSerializer = () => new YamlDataSerializer(polymorphicBaseTypes, customYamlConverters, excludedTypes);
7677
}
7778

7879
public IDataSerializer GetSerializer(string filePath, DataFormat format = DataFormat.Auto)
@@ -85,10 +86,16 @@ public IDataSerializer GetSerializer(string filePath, DataFormat format = DataFo
8586
return format switch
8687
{
8788
DataFormat.Json => _jsonSerializer,
88-
DataFormat.Yaml => _yamlSerializer,
89+
DataFormat.Yaml => GetYamlSerializer(),
8990
DataFormat.Csv => throw new NotSupportedException("CSV format should be handled by source-generated serializers, not by DataSerializer."),
9091
_ => throw new NotSupportedException($"Data format {format} is not supported.")
9192
};
9293
}
94+
95+
private IDataSerializer GetYamlSerializer()
96+
=> _yamlSerializer ?? (_yamlSerializer = _createYamlSerializer());
97+
98+
private static IDataSerializer CreateDefaultYamlSerializer()
99+
=> new YamlDataSerializer();
93100
}
94101
}

0 commit comments

Comments
 (0)