浏览代码

Cleaning up serialisation code

Kenric Nugteren 1 周之前
父节点
当前提交
6881e400bd

+ 25 - 61
InABox.Core/CoreTable/CoreTableJsonConverter.cs

@@ -40,72 +40,36 @@ namespace InABox.Core
                 return null;
 
             var result = new CoreTable();
-            try
+            ReadObject(ref reader, (ref Utf8JsonReader reader, string propertyName) =>
             {
-                reader.Read();
-                while(reader.TokenType != JsonTokenType.EndObject)
+                if (propertyName == "Columns")
                 {
-                    if (reader.TokenType == JsonTokenType.PropertyName)
+                    ReadObject(ref reader, (ref Utf8JsonReader reader, string name) =>
                     {
-                        var propertyName = reader.GetString();
-                        reader.Read(); // Move to property value
-                        if (propertyName == "Columns")
-                        {
-                            if(reader.TokenType != JsonTokenType.StartObject)
-                            {
-                                throw new SerialisationException($"Unexpected token type after \"Columns\": {reader.TokenType}");
-                            }
-                            reader.Read(); // Skip over StartObject
-                            while (reader.TokenType != JsonTokenType.EndObject)
-                            {
-                                string name = reader.GetString()!;
-                                reader.Read(); // Advance to the property value
-                                var type = reader.GetString();
-                                result.Columns.Add(new CoreColumn { ColumnName = name, DataType = CoreUtils.GetEntity(type ?? "") });
-                                reader.Read(); // Move to next token
-                            }
-                            reader.Read(); // Skip EndObject
-                        }
-                        else if (propertyName == "Rows")
+                        var type = reader.GetString();
+                        result.Columns.Add(new CoreColumn { ColumnName = name, DataType = CoreUtils.GetEntity(type ?? "") });
+                    });
+                }
+                else if (propertyName == "Rows")
+                {
+                    ReadArray(ref reader, (ref Utf8JsonReader reader) =>
+                    {
+                        var iCol = 0;
+                        var newRow = result.NewRow();
+                        ReadArray(ref reader, (ref Utf8JsonReader reader) =>
                         {
-                            if(reader.TokenType != JsonTokenType.StartArray)
-                            {
-                                throw new SerialisationException($"Unexpected token type after \"Rows\": {reader.TokenType}");
-                            }
-                            reader.Read(); // Skip StartArray
-                            while (reader.TokenType != JsonTokenType.EndArray)
-                            {
-                                if(reader.TokenType != JsonTokenType.StartArray)
-                                {
-                                    throw new SerialisationException($"Unexpected token type: {reader.TokenType}");
-                                }
-                                reader.Read(); // Skip StartArray
-                                var iCol = 0;
-                                var newrow = result.NewRow();
-                                while (reader.TokenType != JsonTokenType.EndArray)
-                                {
-                                    var col = result.Columns[iCol];
-                                    newrow[col.ColumnName] = CoreUtils.ChangeType(ReadJson(ref reader), col.DataType);
-                                    reader.Read();
-                                    iCol++;
-                                }
-                                result.Rows.Add(newrow);
-                                reader.Read(); // Skip EndArray
-                            }
-                            reader.Read(); // Skip EndArray
-                        }
-                    }
+                            var col = result.Columns[iCol];
+                            newRow[col.ColumnName] = CoreUtils.ChangeType(ReadJson(ref reader), col.DataType);
+                            iCol++;
+                        });
+                        result.Rows.Add(newRow);
+                    });
                 }
-            }
-            catch(SerialisationException e)
-            {
-                Logger.Send(LogType.Error, "", $"SerialisationException: {e.Message}");
-                return null;
-            }
-            catch (Exception e)
-            {
-                Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
-            }
+                else
+                {
+                    reader.Skip();
+                }
+            });
 
             return result;
         }

+ 3 - 6
InABox.Core/Objects/UserProperties.cs

@@ -162,13 +162,10 @@ namespace InABox.Core
         public override UserProperties? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
         {
             var result = new UserProperties();
-            while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
+            ReadObject(ref reader, (ref Utf8JsonReader reader, string key) =>
             {
-                var key = reader.GetString() ?? "";
-                reader.Read();
-                var val = ReadJson(ref reader);
-                result[key] = val;
-            }
+                result[key] = ReadJson(ref reader);
+            });
             return result;
         }
         

+ 8 - 8
InABox.Core/Query/Column.cs

@@ -780,10 +780,10 @@ namespace InABox.Core
             var columnType = typeof(Column<>).MakeGenericType(
                 columns.GetType().GetSuperclassDefinition(typeof(Columns<>))!.GenericTypeArguments[0]);
 
-            while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
+            ReadArray(ref reader, (ref Utf8JsonReader reader) =>
             {
                 columns.Add((JsonSerializer.Deserialize(ref reader, columnType, options) as IColumn)!);
-            }
+            });
 
             return columns;
         }
@@ -814,15 +814,15 @@ namespace InABox.Core
 
             string sType = "";
             string sProp = "";
-            while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
+            ReadObject(ref reader, (ref Utf8JsonReader reader, string tag) =>
             {
-                var tag = reader.GetString();
-                reader.Read();
                 if (Equals(tag, "$type"))
-                    sType = reader.GetString();
+                    sType = reader.GetString() ?? "";
                 else if (Equals(tag, "Property"))
-                    sProp = reader.GetString();
-            }
+                    sProp = reader.GetString() ?? "";
+                else
+                    reader.Skip();
+            });
 
             if (!string.IsNullOrWhiteSpace(sType) && !string.IsNullOrWhiteSpace(sProp))
             {

+ 6 - 4
InABox.Core/Query/Filter.cs

@@ -2129,10 +2129,8 @@ namespace InABox.Core
             List<IFilter> ands = new List<IFilter>();
             List<IFilter> ors = new List<IFilter>();
 
-            while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
+            ReadObject(ref reader, (ref Utf8JsonReader reader, string tag) =>
             {
-                var tag = reader.GetString();
-                reader.Read();
                 if (string.Equals(tag, "$type"))
                 {
                     var sType = reader.GetString();
@@ -2186,7 +2184,11 @@ namespace InABox.Core
                             ors.Add(or);
                     }
                 }
-            }
+                else
+                {
+                    reader.Skip();
+                }
+            });
 
             _type ??= typeToConvert;