diff --git a/SabreTools.Serialization/ConcreteAbstractSerializer.cs b/SabreTools.Serialization/ConcreteAbstractSerializer.cs
new file mode 100644
index 00000000..9b2229b0
--- /dev/null
+++ b/SabreTools.Serialization/ConcreteAbstractSerializer.cs
@@ -0,0 +1,48 @@
+#if !NETFRAMEWORK
+
+using System;
+using System.Reflection;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace SabreTools.Serialization
+{
+ ///
+ /// Serializer class for abstract classes
+ ///
+ ///
+ internal class ConcreteAbstractSerializer : JsonConverterFactory
+ {
+ public override bool CanConvert(Type typeToConvert) => typeToConvert.IsAbstract;
+
+ class ConcreteAbstractSerializerOfType : JsonConverter
+ {
+ 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