mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-09-22 14:55:11 +00:00
Move helper classes out of Wrappers
This commit is contained in:
48
SabreTools.Serialization/ConcreteAbstractSerializer.cs
Normal file
48
SabreTools.Serialization/ConcreteAbstractSerializer.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
#if !NETFRAMEWORK
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
/// <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;
|
||||
|
||||
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(new Type[] { type }),
|
||||
BindingFlags.Instance | BindingFlags.Public,
|
||||
binder: null,
|
||||
args: Array.Empty<object>(),
|
||||
culture: null).ThrowOnNull();
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
48
SabreTools.Serialization/ConcreteInterfaceSerializer.cs
Normal file
48
SabreTools.Serialization/ConcreteInterfaceSerializer.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
#if !NETFRAMEWORK
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
/// <summary>
|
||||
/// Serializer class for interfaces
|
||||
/// </summary>
|
||||
/// <see href="https://stackoverflow.com/a/72775719"/>
|
||||
internal class ConcreteInterfaceSerializer : JsonConverterFactory
|
||||
{
|
||||
public override bool CanConvert(Type typeToConvert) => typeToConvert.IsInterface;
|
||||
|
||||
class ConcreteInterfaceSerializerOfType<TInterface> : JsonConverter<TInterface>
|
||||
{
|
||||
static ConcreteInterfaceSerializerOfType()
|
||||
{
|
||||
if (!typeof(TInterface).IsAbstract && !typeof(TInterface).IsInterface)
|
||||
throw new NotImplementedException(string.Format("Concrete class {0} is not supported", typeof(TInterface)));
|
||||
}
|
||||
|
||||
#if NETCOREAPP3_1
|
||||
public override TInterface Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
|
||||
throw new NotImplementedException();
|
||||
#else
|
||||
public override TInterface? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
|
||||
throw new NotImplementedException();
|
||||
#endif
|
||||
|
||||
public override void Write(System.Text.Json.Utf8JsonWriter writer, TInterface value, JsonSerializerOptions options) =>
|
||||
JsonSerializer.Serialize<object>(writer, value!, options);
|
||||
}
|
||||
|
||||
public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options) =>
|
||||
(JsonConverter)Activator.CreateInstance(
|
||||
typeof(ConcreteInterfaceSerializerOfType<>).MakeGenericType(new Type[] { type }),
|
||||
BindingFlags.Instance | BindingFlags.Public,
|
||||
binder: null,
|
||||
args: Array.Empty<object>(),
|
||||
culture: null).ThrowOnNull();
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
17
SabreTools.Serialization/ObjectExtensions.cs
Normal file
17
SabreTools.Serialization/ObjectExtensions.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
#if !NETFRAMEWORK
|
||||
|
||||
using System;
|
||||
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
/// <summary>
|
||||
/// Extensions for generic object types
|
||||
/// </summary>
|
||||
/// <see href="https://stackoverflow.com/a/72775719"/>
|
||||
internal static class ObjectExtensions
|
||||
{
|
||||
public static T ThrowOnNull<T>(this T? value) where T : class => value ?? throw new ArgumentNullException();
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,94 +0,0 @@
|
||||
#if !NETFRAMEWORK
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace SabreTools.Serialization.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;
|
||||
|
||||
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(new Type[] { type }),
|
||||
BindingFlags.Instance | BindingFlags.Public,
|
||||
binder: null,
|
||||
args: Array.Empty<object>(),
|
||||
culture: null).ThrowOnNull();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Serializer class for interfaces
|
||||
/// </summary>
|
||||
/// <see href="https://stackoverflow.com/a/72775719"/>
|
||||
internal class ConcreteInterfaceSerializer : JsonConverterFactory
|
||||
{
|
||||
public override bool CanConvert(Type typeToConvert) => typeToConvert.IsInterface;
|
||||
|
||||
class ConcreteInterfaceSerializerOfType<TInterface> : JsonConverter<TInterface>
|
||||
{
|
||||
static ConcreteInterfaceSerializerOfType()
|
||||
{
|
||||
if (!typeof(TInterface).IsAbstract && !typeof(TInterface).IsInterface)
|
||||
throw new NotImplementedException(string.Format("Concrete class {0} is not supported", typeof(TInterface)));
|
||||
}
|
||||
|
||||
#if NETCOREAPP3_1
|
||||
public override TInterface Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
|
||||
throw new NotImplementedException();
|
||||
#else
|
||||
public override TInterface? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
|
||||
throw new NotImplementedException();
|
||||
#endif
|
||||
|
||||
public override void Write(System.Text.Json.Utf8JsonWriter writer, TInterface value, JsonSerializerOptions options) =>
|
||||
JsonSerializer.Serialize<object>(writer, value!, options);
|
||||
}
|
||||
|
||||
public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options) =>
|
||||
(JsonConverter)Activator.CreateInstance(
|
||||
typeof(ConcreteInterfaceSerializerOfType<>).MakeGenericType(new Type[] { type }),
|
||||
BindingFlags.Instance | BindingFlags.Public,
|
||||
binder: null,
|
||||
args: Array.Empty<object>(),
|
||||
culture: null).ThrowOnNull();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Extensions for generic object types
|
||||
/// </summary>
|
||||
/// <see href="https://stackoverflow.com/a/72775719"/>
|
||||
internal static class ObjectExtensions
|
||||
{
|
||||
public static T ThrowOnNull<T>(this T? value) where T : class => value ?? throw new ArgumentNullException();
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user