Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions Datra.Tests/DataSerializerFactoryTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using System.Reflection;
using Datra.Attributes;
using Datra.Serializers;
using Xunit;

namespace Datra.Tests
{
public class DataSerializerFactoryTests
{
[Fact]
public void JsonContextFactory_DoesNotCreateYamlSerializerForJsonFormat()
{
var factory = new DataSerializerFactory(TestJsonContext.Default);

var serializer = factory.GetSerializer("Units.yaml", DataFormat.Json);

Assert.IsType<SystemTextJsonDataSerializer>(serializer);
Assert.Null(ReadYamlSerializer(factory));
}

[Fact]
public void JsonContextFactory_CreatesYamlSerializerOnlyForYamlFormat()
{
var factory = new DataSerializerFactory(TestJsonContext.Default);

var serializer = factory.GetSerializer("Units.yaml", DataFormat.Yaml);

Assert.IsType<YamlDataSerializer>(serializer);
Assert.Same(serializer, ReadYamlSerializer(factory));
}

private static object? ReadYamlSerializer(DataSerializerFactory factory)
{
var field = typeof(DataSerializerFactory).GetField(
"_yamlSerializer",
BindingFlags.Instance | BindingFlags.NonPublic);
Assert.NotNull(field);
return field!.GetValue(factory);
}
}
}
17 changes: 12 additions & 5 deletions Datra/Serializers/DataSerializerFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ namespace Datra.Serializers
public class DataSerializerFactory
{
private readonly IDataSerializer _jsonSerializer;
private readonly IDataSerializer _yamlSerializer;
private readonly Func<IDataSerializer> _createYamlSerializer;
private IDataSerializer? _yamlSerializer;

/// <summary>
/// Reflection-mode JSON. Trim/AOT-unsafe — explicit opt-in suitable for tooling/tests.
Expand All @@ -29,7 +30,7 @@ public class DataSerializerFactory
public DataSerializerFactory()
{
_jsonSerializer = SystemTextJsonDataSerializer.CreateReflectionUnsafe();
_yamlSerializer = new YamlDataSerializer();
_createYamlSerializer = CreateDefaultYamlSerializer;
}

/// <summary>
Expand All @@ -39,7 +40,7 @@ public DataSerializerFactory(JsonSerializerContext jsonContext)
{
if (jsonContext == null) throw new ArgumentNullException(nameof(jsonContext));
_jsonSerializer = new SystemTextJsonDataSerializer(jsonContext);
_yamlSerializer = new YamlDataSerializer();
_createYamlSerializer = CreateDefaultYamlSerializer;
}

#if NET8_0_OR_GREATER
Expand Down Expand Up @@ -72,7 +73,7 @@ public DataSerializerFactory(
IEnumerable<Type>? excludedTypes)
{
_jsonSerializer = SystemTextJsonDataSerializer.CreateReflectionUnsafe();
_yamlSerializer = new YamlDataSerializer(polymorphicBaseTypes, customYamlConverters, excludedTypes);
_createYamlSerializer = () => new YamlDataSerializer(polymorphicBaseTypes, customYamlConverters, excludedTypes);
}

public IDataSerializer GetSerializer(string filePath, DataFormat format = DataFormat.Auto)
Expand All @@ -85,10 +86,16 @@ public IDataSerializer GetSerializer(string filePath, DataFormat format = DataFo
return format switch
{
DataFormat.Json => _jsonSerializer,
DataFormat.Yaml => _yamlSerializer,
DataFormat.Yaml => GetYamlSerializer(),
DataFormat.Csv => throw new NotSupportedException("CSV format should be handled by source-generated serializers, not by DataSerializer."),
_ => throw new NotSupportedException($"Data format {format} is not supported.")
};
}

private IDataSerializer GetYamlSerializer()
=> _yamlSerializer ?? (_yamlSerializer = _createYamlSerializer());

private static IDataSerializer CreateDefaultYamlSerializer()
=> new YamlDataSerializer();
}
}
Loading