Browse Source

Fixed serialisation to be JSON now

Kenric Nugteren 8 months ago
parent
commit
980ec44c57

+ 1 - 1
prs.classes/Entities/Events/Event.cs

@@ -28,7 +28,7 @@ namespace Comal.Classes
         /// Serialised event data.
         /// </summary>
         [NullEditor]
-        public byte[] Data { get; set; } = Array.Empty<byte>();
+        public string Data { get; set; } = "";
 
         [ExpressionEditor(null)]
         public string NotificationExpression { get; set; } = "";

+ 3 - 7
prs.shared/Grids/EventGrid.cs

@@ -140,9 +140,7 @@ public class EventGrid : DynamicDataGrid<Event>
         IEventData? data = null;
         if(ev.Data is not null && ev.Data.Length != 0)
         {
-            using var stream = new MemoryStream(ev.Data);
-            var reader = new CoreBinaryReader(stream, BinarySerializationSettings.Latest);
-            data = EventUtils.Deserialize(reader);
+            data = EventUtils.Deserialize(ev.Data);
         }
         EventData = data;
     }
@@ -182,13 +180,11 @@ public class EventGrid : DynamicDataGrid<Event>
             ev.EventType = type;
             if(data is not null)
             {
-                using var stream = new MemoryStream();
-                EventUtils.Serialize(data, new CoreBinaryWriter(stream, BinarySerializationSettings.Latest));
-                ev.Data = stream.ToArray();
+                ev.Data = EventUtils.Serialize(data);
             }
             else
             {
-                ev.Data = [];
+                ev.Data = "";
             }
         }
     }

+ 21 - 98
prs.stores/Events/Event.cs

@@ -2,6 +2,8 @@
 using Expressive;
 using InABox.Core;
 using InABox.Database;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -13,7 +15,7 @@ using System.Threading.Tasks;
 
 namespace PRS.Shared.Events;
 
-public interface IEventData : ISerializeBinary
+public interface IEventData
 {
     IEvent Event { get; }
 
@@ -48,113 +50,37 @@ public class EventData<T, TDataModel> : IEventData
     }
 
     public Notification GenerateNotification(TDataModel model) => Event.GenerateNotification(model);
-
-    public void SerializeBinary(CoreBinaryWriter writer)
-    {
-        Event.SerializeBinary(writer);
-        writer.Write(Triggers.Count);
-        foreach(var trigger in Triggers)
-        {
-            EventUtils.SerializeObject(trigger, writer);
-        }
-        writer.Write(Actions.Count);
-        foreach(var action in Actions)
-        {
-            EventUtils.SerializeObject(action, writer);
-        }
-    }
-
-    public void DeserializeBinary(CoreBinaryReader reader)
-    {
-        Event.DeserializeBinary(reader);
-        var nTriggers = reader.ReadInt32();
-        for(int i = 0; i < nTriggers; ++i)
-        {
-            var trigger = EventUtils.DeserializeObject<IEventTrigger<T, TDataModel>>(EventUtils.GetTriggerType, reader);
-            Triggers.Add(trigger);
-        }
-        var nActions = reader.ReadInt32();
-        for(int i = 0; i < nActions; ++i)
-        {
-            var action = EventUtils.DeserializeObject<IEventAction<T>>(EventUtils.GetActionType, reader);
-            Actions.Add(action);
-        }
-    }
 }
 
 public static class EventUtils
 {
     #region Serialisation
 
-    public static void SerializeObject(ISerializeBinary obj, CoreBinaryWriter writer)
+    private class WritablePropertiesOnlyResolver : DefaultContractResolver
     {
-        writer.Write(obj.GetType().Name);
-        foreach(var arg in obj.GetType().GenericTypeArguments)
+        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
         {
-            writer.Write(CoreUtils.EntityName(arg));
+            IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
+            return props.Where(p => p.Writable).ToList();
         }
-        obj.SerializeBinary(writer);
     }
-    public static T DeserializeObject<T>(Func<string, Type> typeSource, CoreBinaryReader reader)
-        where T : class, ISerializeBinary
-    {
-        var eventTypeName = reader.ReadString();
-        var objType = typeSource(eventTypeName);
 
-        var typeParams = objType.GetTypeInfo().GenericTypeParameters;
-        var typeArgs = new Type[typeParams.Length];
-        for(int i = 0; i < typeParams.Length; ++i)
-        {
-            var entityType = CoreUtils.GetEntity(reader.ReadString());
-            typeArgs[i] = entityType;
-        }
-        if(typeArgs.Length > 0)
-        {
-            objType = objType.MakeGenericType(typeArgs);
-        }
-        var obj = (Activator.CreateInstance(objType) as T)!;
-        obj.DeserializeBinary(reader);
-
-        return obj;
+    private static JsonSerializerSettings SerializationSettings()
+    {
+        var settings = Serialization.CreateSerializerSettings();
+        settings.TypeNameHandling = TypeNameHandling.Auto;
+        settings.ContractResolver = new WritablePropertiesOnlyResolver();
+        return settings;
     }
 
-    public static void Serialize(IEventData data, CoreBinaryWriter writer)
+    public static string Serialize(IEventData data)
     {
-        writer.Write(data.Event.GetType().Name);
-        foreach(var arg in data.Event.GetType().GenericTypeArguments)
-        {
-            writer.Write(CoreUtils.EntityName(arg));
-        }
-        data.SerializeBinary(writer);
+        return JsonConvert.SerializeObject(data, typeof(IEventData), SerializationSettings());
     }
 
-    public static IEventData Deserialize(CoreBinaryReader reader)
+    public static IEventData Deserialize(string json)
     {
-        var eventTypeName = reader.ReadString();
-        var eventType = EventUtils.GetEventType(eventTypeName);
-
-        var typeParams = eventType.GetTypeInfo().GenericTypeParameters;
-        var typeArgs = new Type[typeParams.Length];
-        for(int i = 0; i < typeParams.Length; ++i)
-        {
-            var entityType = CoreUtils.GetEntity(reader.ReadString());
-            typeArgs[i] = entityType;
-        }
-        if(typeArgs.Length > 0)
-        {
-            eventType = eventType.MakeGenericType(typeArgs);
-        }
-        var ev = (Activator.CreateInstance(eventType) as IEvent)!;
-
-        var dataModelType = ev.GetType().GetInterfaceDefinition(typeof(IEvent<>))!.GenericTypeArguments[0];
-
-        var eventDataType = typeof(EventData<,>).MakeGenericType(ev.GetType(), dataModelType);
-
-        var eventData = (Activator.CreateInstance(eventDataType, ev) as IEventData)!;
-
-        eventData.DeserializeBinary(reader);
-
-        return eventData;
+        return JsonConvert.DeserializeObject<IEventData>(json, SerializationSettings())!;
     }
 
     #endregion
@@ -336,9 +262,7 @@ public static class EventUtils
     {
         if(ev.Data is not null && ev.Data.Length != 0)
         {
-            using var stream = new MemoryStream(ev.Data);
-            var reader = new CoreBinaryReader(stream, BinarySerializationSettings.Latest);
-            var data = Deserialize(reader);
+            var data = Deserialize(ev.Data);
 
             var entityType = data.Event.GetType().GenericTypeArguments[0];
             var list = _entityEvents.GetValueOrAdd(ev.EventType).GetValueOrAdd(entityType);
@@ -523,13 +447,12 @@ public class ChildEventDataModel : IChildEventDataModel
 
     public void Init(IEventData data)
     {
-        throw new NotImplementedException();
     }
 }
 
 #endregion
 
-public interface IEvent : ISerializeBinary
+public interface IEvent
 {
     IEventDataModelDefinition DataModelDefinition();
 
@@ -601,14 +524,14 @@ public interface IEventTrigger
     string Description { get; }
 }
 
-public interface IEventTrigger<TEvent, TDataModel> : ISerializeBinary, IEventTrigger
+public interface IEventTrigger<TEvent, TDataModel> : IEventTrigger
     where TEvent : IEvent<TDataModel>
     where TDataModel : IEventDataModel
 {
     bool Check(TDataModel dataModel);
 }
 
-public interface IEventAction : ISerializeBinary
+public interface IEventAction
 {
     IEnumerable<string> ReferencedVariables { get; }
 

+ 33 - 122
prs.stores/Events/SaveEvent.cs

@@ -2,6 +2,7 @@
 using InABox.Core;
 using InABox.Database;
 using InABox.Scripting;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
@@ -34,13 +35,6 @@ public class SaveEvent<T> : IEvent<SaveEventDataModel<T>>
         return notification;
     }
 
-    public void SerializeBinary(CoreBinaryWriter writer)
-    {
-    }
-    public void DeserializeBinary(CoreBinaryReader reader)
-    {
-    }
-
     public void Init(IStore store, IEventData evData, SaveEventDataModel<T> model)
     {
         if (model.Entity.ID != Guid.Empty)
@@ -157,21 +151,25 @@ public class CreatedSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventD
     {
         return dataModel.Entity.HasOriginalValue(x => x.ID);
     }
-
-    public void SerializeBinary(CoreBinaryWriter writer)
-    {
-    }
-    public void DeserializeBinary(CoreBinaryReader reader)
-    {
-    }
 }
 
 [Caption("Property Changed")]
 public class PropertyChangedSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventDataModel<T>>
     where T : Entity, new()
 {
+    [JsonIgnore]
     public IProperty? TriggerProperty { get; set; }
 
+    [JsonProperty(PropertyName = "TriggerProperty")]
+    private string? _property
+    {
+        get => TriggerProperty?.Name;
+        set
+        {
+            TriggerProperty = value is null ? null : DatabaseSchema.PropertyStrict(typeof(T), value); 
+        }
+    }
+
     public string Description => TriggerProperty is null
         ? $"{typeof(T).GetCaption()} changed"
         : $"{typeof(T).GetCaption()}.{TriggerProperty.Name} changed";
@@ -190,30 +188,6 @@ public class PropertyChangedSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, Sa
         }
         return true;
     }
-
-    public void SerializeBinary(CoreBinaryWriter writer)
-    {
-        if(TriggerProperty is null)
-        {
-            writer.Write(false);
-        }
-        else
-        {
-            writer.Write(true);
-            writer.Write(TriggerProperty.Name);
-        }
-    }
-    public void DeserializeBinary(CoreBinaryReader reader)
-    {
-        if(reader.ReadBoolean())
-        {
-            TriggerProperty = DatabaseSchema.PropertyStrict(typeof(T), reader.ReadString());
-        }
-        else
-        {
-            TriggerProperty = null;
-        }
-    }
 }
 
 [Caption("Custom Script")]
@@ -265,24 +239,6 @@ public class Module
         }
         return _scriptDocument.Execute(methodname: "Check", parameters: [dataModel]);
     }
-
-    public void SerializeBinary(CoreBinaryWriter writer)
-    {
-        writer.Write(Script ?? "");
-    }
-
-    public void DeserializeBinary(CoreBinaryReader reader)
-    {
-        var script = reader.ReadString();
-        if (script.IsNullOrWhiteSpace())
-        {
-            Script = null;
-        }
-        else
-        {
-            Script = script;
-        }
-    }
 }
 
 #endregion
@@ -349,32 +305,16 @@ public class Module
             return null;
         }
     }
-
-    public void SerializeBinary(CoreBinaryWriter writer)
-    {
-        writer.Write(Script ?? "");
-    }
-
-    public void DeserializeBinary(CoreBinaryReader reader)
-    {
-        var script = reader.ReadString();
-        if (script.IsNullOrWhiteSpace())
-        {
-            Script = null;
-        }
-        else
-        {
-            Script = script;
-        }
-    }
 }
 
 [Caption("Create Entity")]
 public class CreateEntitySaveEventAction<T> : IEventAction<SaveEvent<T>>
     where T : Entity, new()
 {
+    [JsonProperty(Order = 1)]
     public Type? EntityType { get; set; }
 
+    [JsonIgnore]
     public List<PropertyInitializer> Initializers { get; set; } = new List<PropertyInitializer>();
 
     public string Description => $"Create New {EntityType?.Name ?? "Entity"}";
@@ -396,41 +336,27 @@ public class CreateEntitySaveEventAction<T> : IEventAction<SaveEvent<T>>
         return entity;
     }
 
-    public void SerializeBinary(CoreBinaryWriter writer)
+    #region Serialization Stuff
+
+    [JsonProperty(Order = 2, PropertyName = "Initializers")]
+    private PropertyInitializerSerializationItem[] _initializers
     {
-        if(EntityType is null)
-        {
-            writer.Write(false);
-        }
-        else
-        {
-            writer.Write(true);
-            writer.Write(EntityType.EntityName());
-        }
-        writer.Write(Initializers.Count);
-        foreach(var init in Initializers)
+        get => Initializers.ToArray(x => new PropertyInitializerSerializationItem { Property = x.Property.Name, Value = x.Value });
+        set
         {
-            init.SerializeBinary(writer);
+            Initializers.Clear();
+            Initializers.AddRange(value.Select(x => new PropertyInitializer(EntityType!, x)));
         }
     }
-    public void DeserializeBinary(CoreBinaryReader reader)
-    {
-        if(reader.ReadBoolean())
-        {
-            EntityType = CoreUtils.GetEntity(reader.ReadString());
-        }
-        else
-        {
-            EntityType = null;
-        }
 
-        var nInit = reader.ReadInt32();
-        for(int i = 0; i < nInit; ++i)
-        {
-            var init = new PropertyInitializer(reader, EntityType!);
-            Initializers.Add(init);
-        }
-    }
+    #endregion
+}
+
+internal class PropertyInitializerSerializationItem
+{
+    public string Property { get; set; }
+
+    public string Value { get; set; }
 }
 
 public class PropertyInitializer
@@ -464,12 +390,10 @@ public class PropertyInitializer
 
     public IEnumerable<string> ReferencedVariables => ValueExpression.ReferencedVariables;
 
-    /// <summary>
-    /// <b>Only for use in serialisation.</b>
-    /// </summary>
-    public PropertyInitializer(CoreBinaryReader reader, Type entityType)
+    internal PropertyInitializer(Type entityType, PropertyInitializerSerializationItem item)
     {
-        DeserializeBinary(reader, entityType);
+        Value = item.Value;
+        Property = DatabaseSchema.PropertyStrict(entityType, item.Property);
     }
 
     public PropertyInitializer(IProperty property, string value)
@@ -482,19 +406,6 @@ public class PropertyInitializer
     {
         Property.Setter()(entity, ValueExpression.Evaluate(dataModel));
     }
-
-    public void SerializeBinary(CoreBinaryWriter writer)
-    {
-        writer.Write(Property.Name);
-        writer.Write(Value);
-    }
-
-    [MemberNotNull(nameof(Property), nameof(_value))]
-    public void DeserializeBinary(CoreBinaryReader reader, Type entityType)
-    {
-        Property = DatabaseSchema.PropertyStrict(entityType, reader.ReadString());
-        Value = reader.ReadString();
-    }
 }
 
 #endregion