Browse Source

Fixed columns serialization

Kenric Nugteren 1 week ago
parent
commit
e55b49cae3
2 changed files with 62 additions and 163 deletions
  1. 45 0
      InABox.Core/Query/Column.cs
  2. 17 163
      InABox.Core/Serialization.cs

+ 45 - 0
InABox.Core/Query/Column.cs

@@ -5,6 +5,7 @@ using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Text.Json;
+using System.Text.Json.Serialization;
 
 namespace InABox.Core
 {
@@ -762,6 +763,50 @@ namespace InABox.Core
     }
 
 
+    public class ColumnsJsonConverter : CustomJsonConverter<IColumns>
+    {
+        public override bool CanConvert(Type objectType)
+        {
+            if (objectType.IsConstructedGenericType)
+            {
+                var ot = objectType.GetGenericTypeDefinition();
+                var tt = typeof(Columns<>);
+                if (ot == tt)
+                    return true;
+            }
+            return false;
+        }
+
+        public override IColumns? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            if (reader.TokenType == JsonTokenType.Null)
+                return null;
+
+            var columns = (Activator.CreateInstance(typeToConvert, true) as IColumns)!;
+
+            var columnType = typeof(Column<>).MakeGenericType(
+                columns.GetType().GetSuperclassDefinition(typeof(Columns<>))!.GenericTypeArguments[0]);
+
+            while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
+            {
+                columns.Add((JsonSerializer.Deserialize(ref reader, columnType, options) as IColumn)!);
+            }
+
+            return columns;
+        }
+
+        public override void Write(Utf8JsonWriter writer, IColumns value, JsonSerializerOptions options)
+        {
+            var columnType = typeof(Column<>).MakeGenericType(
+                value.GetType().GetSuperclassDefinition(typeof(Columns<>))!.GenericTypeArguments[0]);
+            writer.WriteStartArray();
+            foreach(var column in value)
+            {
+                JsonSerializer.Serialize(writer, column, columnType, options);
+            }
+            writer.WriteEndArray();
+        }
+    }
     public class ColumnJsonConverter : CustomJsonConverter<IColumn>
     {
         public override bool CanConvert(Type objectType)

+ 17 - 163
InABox.Core/Serialization.cs

@@ -32,6 +32,17 @@ namespace InABox.Core
     {
         //private static JsonSerializerOptions? _serializerSettings;
 
+        private static JsonConverter[]? _converters;
+
+        private static JsonConverter[] GetConverters()
+        {
+            _converters ??= CoreUtils.Entities.Where(x => typeof(JsonConverter).IsAssignableFrom(x))
+                .Select(x => Activator.CreateInstance(x) as JsonConverter)
+                .NotNull()
+                .ToArray();
+            return _converters;
+        }
+
         private static JsonSerializerOptions SerializerSettings(bool indented = true)
         {
             var serializerSettings = CreateSerializerSettings();
@@ -42,22 +53,14 @@ namespace InABox.Core
 
         public static JsonSerializerOptions CreateSerializerSettings(bool indented = true)
         {
-            var settings = new JsonSerializerOptions
-            {
-                // DateParseHandling = DateParseHandling.DateTime,
-                // DateFormatHandling = DateFormatHandling.IsoDateFormat,
-                // DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
-            };
-
-            settings.Converters.Add(new CoreTableJsonConverter());
+            var settings = new JsonSerializerOptions { };
 
-            settings.Converters.Add(new FilterJsonConverter());
-            settings.Converters.Add(new ColumnJsonConverter());
-            settings.Converters.Add(new SortOrderJsonConverter());
-            settings.Converters.Add(new UserPropertiesJsonConverter());
-            // settings.Converters.Add(new BaseObjectJSONConverter());
+            foreach (var converter in GetConverters())
+            {
+                settings.Converters.Add(converter);
+            }
 
-            settings.WriteIndented = indented; // ? Formatting.Indented : Formatting.None;
+            settings.WriteIndented = indented;
             return settings;
         }
 
@@ -71,21 +74,8 @@ namespace InABox.Core
         {
             var settings = SerializerSettings(indented);
             JsonSerializer.Serialize(stream, o, settings);
-            // using (var sw = new StreamWriter(stream))
-            // {
-            //     using (JsonWriter writer = new JsonTextWriter(sw))
-            //     {
-            //         var serializer = JsonSerializer.Create(settings);
-            //         serializer.Serialize(writer, o);
-            //     }
-            // }
         }
 
-        // public static void DeserializeInto(string json, object target)
-        // {
-        //     JsonConvert.PopulateObject(json, target, SerializerSettings());
-        // }
-
         [return: MaybeNull]
         public static T Deserialize<T>(Stream? stream, bool strict = false)
         {
@@ -96,10 +86,6 @@ namespace InABox.Core
             {
                 var settings = SerializerSettings();
                 return JsonSerializer.Deserialize<T>(stream, settings);
-                // using var sr = new StreamReader(stream);
-                // using JsonReader reader = new JsonTextReader(sr);
-                // var serializer = JsonSerializer.Create(settings);
-                // return serializer.Deserialize<T>(reader);
             }
             catch (Exception e)
             {
@@ -119,47 +105,10 @@ namespace InABox.Core
             object? result = null;
             var settings = SerializerSettings();
             result = JsonSerializer.Deserialize(stream, type, settings);
-            // using (var sr = new StreamReader(stream))
-            // {
-            //     using (JsonReader reader = new JsonTextReader(sr))
-            //     {
-            //         var serializer = JsonSerializer.Create(settings);
-            //         result = serializer.Deserialize(reader, type);
-            //     }
-            // }
 
             return result;
         }
 
-        // [return: MaybeNull]
-        // public static T Deserialize<T>(JToken obj, bool strict = false)
-        // {
-        //     var ret = default(T);
-        //     try
-        //     {
-        //         var settings = SerializerSettings();
-        //         var serializer = JsonSerializer.Create(settings);
-        //         return obj.ToObject<T>();
-        //     }
-        //     catch (Exception)
-        //     {
-        //         if (strict)
-        //         {
-        //             throw;
-        //         }
-        //         if (typeof(T).IsArray)
-        //         {
-        //             ret = (T)(object)Array.CreateInstance(typeof(T).GetElementType(), 0);
-        //         }
-        //         else
-        //         {
-        //             ret = Activator.CreateInstance<T>();
-        //         }
-        //     }
-        //
-        //     return ret;
-        // }
-
         [return: MaybeNull]
         public static T Deserialize<T>(string? json, bool strict = false) // where T : new()
         {
@@ -170,19 +119,9 @@ namespace InABox.Core
             try
             {
                 var settings = SerializerSettings();
-                //if (typeof(T).IsSubclassOf(typeof(BaseObject)))
-                //{
-                //    ret = Activator.CreateInstance<T>();
-                //    (ret as BaseObject).SetObserving(false);
-                //    JsonConvert.PopulateObject(json, ret, settings);
-                //    (ret as BaseObject).SetObserving(true);
-                //}
-                //else 
                 if (typeof(T).IsArray)
                 {
                     ret = JsonSerializer.Deserialize<T>(json, settings);
-                    //object o = Array.CreateInstance(typeof(T).GetElementType(), 0);
-                    //ret = (T)o;
                 }
                 else
                 {
@@ -219,14 +158,6 @@ namespace InABox.Core
             try
             {
                 var settings = SerializerSettings();
-                //if (typeof(T).IsSubclassOf(typeof(BaseObject)))
-                //{
-                //    ret = Activator.CreateInstance<T>();
-                //    (ret as BaseObject).SetObserving(false);
-                //    JsonConvert.PopulateObject(json, ret, settings);
-                //    (ret as BaseObject).SetObserving(true);
-                //}
-                //else 
                 if (T.IsArray)
                 {
                     object o = Array.CreateInstance(T.GetElementType(), 0);
@@ -962,81 +893,4 @@ namespace InABox.Core
             WriteJson(writer, value);
         }
     }
-
-    public class BaseObjectJSONConverter : CustomJsonConverter<BaseObject>
-    {
-        public override bool CanConvert(Type objectType)
-        {
-            return objectType.IsSubclassOf(typeof(BaseObject));
-        }
-
-        public override BaseObject? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
-        {
-            BaseObject obj = (Activator.CreateInstance(typeToConvert) as BaseObject)!;
-            obj.OriginalValues ??= new ConcurrentDictionary<string, object?>();
-            obj.SetObserving(false);
-
-            if (reader.TokenType == JsonTokenType.StartObject)
-            {
-                reader.Read();
-                while (reader.TokenType != JsonTokenType.EndObject)
-                {
-                    if (reader.TokenType != JsonTokenType.PropertyName)
-                        throw new JsonException("Expected PropertyName token.");
-
-                    string propertyName = reader.GetString();
-                    reader.Read(); // Advance to the property value
-
-                    if (Equals(propertyName, "OriginalValues"))
-                    {
-                        while (reader.Read())
-                        {
-                            if (reader.TokenType == JsonTokenType.EndObject)
-                                break;
-                            string? name = reader.GetString();
-                            reader.Read();
-                            if (!string.IsNullOrWhiteSpace(name))
-                                obj.OriginalValues[name] = ReadJson(ref reader);
-
-                        }
-                    }
-                    else if (DatabaseSchema.Property(typeToConvert, propertyName) is IProperty prop)
-                    {
-                        var value = ReadJson(ref reader);
-                        prop.Setter()(obj, value);
-                    }
-                }
-            }
-            obj.SetObserving(true);
-            return obj;
-        }
-
-        
-
-        public override void Write(Utf8JsonWriter writer, BaseObject obj, JsonSerializerOptions options)
-        {
-            writer.WriteStartObject();
-            writer.WritePropertyName("OriginalValues");
-            writer.WriteStartObject();
-            if (obj.OriginalValues != null)
-            {
-                foreach (var key in obj.OriginalValues.Keys)
-                {
-                    var val = obj.OriginalValues[key];
-                    if (val == null)
-                        writer.WriteNull(key);
-                    else
-                        writer.WriteString(key, val.ToString());
-                }
-            }
-            foreach(var property in DatabaseSchema.Properties(obj.GetType()))
-            {
-                var val = property.Getter()(obj);
-                WriteJson(writer, property.Name, property.Getter());
-            }
-            writer.WriteEndObject();
-            
-        }
-        
-    }
 }