Files
SabreTools.Serialization/SabreTools.Wrappers/ConcreteAbstractSerializer.cs
Matt Nadareski 7689c6dd07 Libraries
This change looks dramatic, but it's just separating out the already-split namespaces into separate top-level folders. In theory, every single one could be built into their own Nuget package. `SabreTools.Serialization` still builds the normal Nuget package that is used by all other projects and includes all namespaces.
2026-03-21 16:26:56 -04:00

49 lines
1.8 KiB
C#

#if NETCOREAPP
using System;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace SabreTools.Wrappers
{
/// <summary>
/// Serializer class for abstract classes
/// </summary>
/// <see href="https://stackoverflow.com/a/72775719"/>
internal class ConcreteAbstractSerializer : JsonConverterFactory
{
public override bool CanConvert(Type typeToConvert) => typeToConvert.IsAbstract;
private class ConcreteAbstractSerializerOfType<TAbstract> : JsonConverter<TAbstract>
{
static ConcreteAbstractSerializerOfType()
{
if (!typeof(TAbstract).IsAbstract && !typeof(TAbstract).IsInterface)
throw new NotImplementedException(string.Format("Concrete class {0} is not supported", typeof(TAbstract)));
}
#if NETCOREAPP3_1
public override TAbstract Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> throw new NotImplementedException();
#else
public override TAbstract? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> throw new NotImplementedException();
#endif
public override void Write(Utf8JsonWriter writer, TAbstract value, JsonSerializerOptions options)
=> JsonSerializer.Serialize<object>(writer, value!, options);
}
public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options)
=> (JsonConverter)Activator.CreateInstance(
typeof(ConcreteAbstractSerializerOfType<>).MakeGenericType([type]),
BindingFlags.Instance | BindingFlags.Public,
binder: null,
args: [],
culture: null).ThrowOnNull();
}
}
#endif