diff --git a/Engine.Core/Serialization/EntityReference.cs b/Engine.Core/Serialization/EntityReference.cs new file mode 100644 index 0000000..9c92ce4 --- /dev/null +++ b/Engine.Core/Serialization/EntityReference.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; + +namespace Syntriax.Engine.Core.Serialization; + +public record class EntityReference(string? Id = null); + +public class EntityRegistry +{ + public event EntityRegisteredEventHandler? OnEntityRegistered = null!; + + private readonly Dictionary?> assignCallbacks = []; + private readonly Dictionary registeredEntities = []; + public IReadOnlyDictionary RegisteredEntities => registeredEntities; + + public void Add(IEntity entity) + { + if (registeredEntities.TryAdd(entity.Id, entity)) + OnEntityRegistered?.InvokeSafe(this, entity); + } + + public void QueueAssign(string id, Action setMethod) + { + assignCallbacks.TryAdd(id, null); + assignCallbacks[id] = assignCallbacks[id] + setMethod; + } + + public void AssignAll() + { + foreach ((string id, Action? action) in assignCallbacks) + action?.InvokeSafe(registeredEntities[id]); + } + + public delegate void EntityRegisteredEventHandler(EntityRegistry sender, IEntity entity); +} diff --git a/Engine.Core/Serialization/SerializedClass.cs b/Engine.Core/Serialization/SerializedClass.cs index f9a4f56..6d5bd1e 100644 --- a/Engine.Core/Serialization/SerializedClass.cs +++ b/Engine.Core/Serialization/SerializedClass.cs @@ -104,17 +104,54 @@ public class SerializedClass object instance = TypeFactory.Get(type); foreach ((string key, object? value) in Private) - if (type.GetField(key, PRIVATE_BINDING_FLAGS) is FieldInfo fieldInfo) - fieldInfo.SetValue(instance, value); - else if (type.GetProperty(key, PRIVATE_BINDING_FLAGS) is PropertyInfo propertyInfo) - propertyInfo.SetValue(instance, value); + AssignVariable(key, type, instance, value, PRIVATE_BINDING_FLAGS); foreach ((string key, object? value) in Public) - if (type.GetField(key, PUBLIC_BINDING_FLAGS) is FieldInfo fieldInfo) - fieldInfo.SetValue(instance, value); - else if (type.GetProperty(key, PUBLIC_BINDING_FLAGS) is PropertyInfo propertyInfo) - propertyInfo.SetValue(instance, value); + AssignVariable(key, type, instance, value, PUBLIC_BINDING_FLAGS); return instance; } + + public object CreateInstance(EntityRegistry? entityRegistry) + { + if (entityRegistry is null) + return CreateInstance(); + + Type type = TypeFactory.GetType(Type); + object instance = TypeFactory.Get(type); + + foreach ((string key, object? value) in Private) + AssignVariable(key, type, instance, value, PRIVATE_BINDING_FLAGS, entityRegistry); + + foreach ((string key, object? value) in Public) + AssignVariable(key, type, instance, value, PUBLIC_BINDING_FLAGS, entityRegistry); + + return instance; + } + + private static void AssignVariable(string key, Type type, object instance, object? value, BindingFlags bindingFlags, EntityRegistry entityRegistry) + { + if (type.GetField(key, bindingFlags) is FieldInfo fieldInfo) + { + if (typeof(IEntity).IsAssignableFrom(fieldInfo.FieldType)) + entityRegistry.QueueAssign(value?.ToString() ?? "", (entity) => fieldInfo.SetValue(instance, entity)); + else + fieldInfo.SetValue(instance, value); + } + else if (type.GetProperty(key, bindingFlags) is PropertyInfo propertyInfo) + { + if (typeof(IEntity).IsAssignableFrom(propertyInfo.PropertyType)) + entityRegistry.QueueAssign(value?.ToString() ?? "", (entity) => propertyInfo.SetValue(instance, entity)); + else + propertyInfo.SetValue(instance, value); + } + } + + private static void AssignVariable(string key, Type type, object instance, object? value, BindingFlags bindingFlags) + { + if (type.GetField(key, bindingFlags) is FieldInfo fieldInfo) + fieldInfo.SetValue(instance, value); + else if (type.GetProperty(key, bindingFlags) is PropertyInfo propertyInfo) + propertyInfo.SetValue(instance, value); + } } diff --git a/Engine.Core/Serialization/Serializer.cs b/Engine.Core/Serialization/Serializer.cs index b2e752a..bdd2f73 100644 --- a/Engine.Core/Serialization/Serializer.cs +++ b/Engine.Core/Serialization/Serializer.cs @@ -23,14 +23,16 @@ public static class Serializer return serializerBuilder.Build(); } - private static readonly IDeserializer deserializer = GetDeserializer(); - private static IDeserializer GetDeserializer() + private static IDeserializer GetDeserializer(EntityRegistry entityRegistry) { DeserializerBuilder serializerBuilder = new DeserializerBuilder() .WithNamingConvention(PascalCaseNamingConvention.Instance); foreach (IEngineTypeYamlSerializer typeConverter in GetEngineYamlTypeConverters()) + { + typeConverter.EntityRegistry = entityRegistry; serializerBuilder = serializerBuilder.WithTypeConverter(typeConverter); + } return serializerBuilder.Build(); } @@ -48,16 +50,25 @@ public static class Serializer public static object Deserialize(string yaml) { - return deserializer.Deserialize(yaml)!; + EntityRegistry entityRegistry = new(); + object result = GetDeserializer(entityRegistry).Deserialize(yaml)!; + entityRegistry.AssignAll(); + return result; } public static object Deserialize(string yaml, Type type) { - return deserializer.Deserialize(yaml, type)!; + EntityRegistry entityRegistry = new(); + object result = GetDeserializer(entityRegistry).Deserialize(yaml, type)!; + entityRegistry.AssignAll(); + return result; } public static T Deserialize(string yaml) { - return deserializer.Deserialize(yaml); + EntityRegistry entityRegistry = new(); + T result = GetDeserializer(entityRegistry).Deserialize(yaml); + entityRegistry.AssignAll(); + return result; } } diff --git a/Engine.Core/Serialization/Serializers/Abstract/IEngineTypeYamlSerializer.cs b/Engine.Core/Serialization/Serializers/Abstract/IEngineTypeYamlSerializer.cs index 5cfce31..8b60078 100644 --- a/Engine.Core/Serialization/Serializers/Abstract/IEngineTypeYamlSerializer.cs +++ b/Engine.Core/Serialization/Serializers/Abstract/IEngineTypeYamlSerializer.cs @@ -2,4 +2,7 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public interface IEngineTypeYamlSerializer : IYamlTypeConverter; +public interface IEngineTypeYamlSerializer : IYamlTypeConverter +{ + EntityRegistry EntityRegistry { get; set; } +} diff --git a/Engine.Core/Serialization/Serializers/BehaviourControllerSerializer.cs b/Engine.Core/Serialization/Serializers/BehaviourControllerSerializer.cs index f4690df..5650c2f 100644 --- a/Engine.Core/Serialization/Serializers/BehaviourControllerSerializer.cs +++ b/Engine.Core/Serialization/Serializers/BehaviourControllerSerializer.cs @@ -8,14 +8,11 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class BehaviourControllerSerializer : IEngineTypeYamlSerializer +public class BehaviourControllerSerializer : EngineTypeYamlSerializerBase { - private const string SERIALIZED_SCALAR_NAME = "Properties"; private const string BEHAVIOURS_SCALAR_NAME = "Behaviours"; - public bool Accepts(Type type) => typeof(IBehaviourController).IsAssignableFrom(type); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override IBehaviourController? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { string id; @@ -32,7 +29,7 @@ public class BehaviourControllerSerializer : IEngineTypeYamlSerializer if (parser.Consume().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0) throw new(); SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!; - behaviourController = (IBehaviourController)instanceSerializedClass.CreateInstance(); + behaviourController = (IBehaviourController)instanceSerializedClass.CreateInstance(EntityRegistry); string value = parser.Consume().Value; if (value.CompareTo(nameof(IBehaviourController.StateEnable)) != 0) @@ -56,7 +53,7 @@ public class BehaviourControllerSerializer : IEngineTypeYamlSerializer return behaviourController; } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { IBehaviourController behaviourController = (IBehaviourController)value!; diff --git a/Engine.Core/Serialization/Serializers/BehaviourSerializer.cs b/Engine.Core/Serialization/Serializers/BehaviourSerializer.cs index 679fa78..737eac0 100644 --- a/Engine.Core/Serialization/Serializers/BehaviourSerializer.cs +++ b/Engine.Core/Serialization/Serializers/BehaviourSerializer.cs @@ -6,13 +6,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class BehaviourSerializer : IEngineTypeYamlSerializer +public class BehaviourSerializer : EngineTypeYamlSerializerBase { - private const string SERIALIZED_SCALAR_NAME = "Properties"; - - public bool Accepts(Type type) => typeof(IBehaviour).IsAssignableFrom(type); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override IBehaviour? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { string id; int priority; @@ -33,7 +29,7 @@ public class BehaviourSerializer : IEngineTypeYamlSerializer if (parser.Consume().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0) throw new(); SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!; - behaviour = (IBehaviour)instanceSerializedClass.CreateInstance(); + behaviour = (IBehaviour)instanceSerializedClass.CreateInstance(EntityRegistry); if (parser.Consume().Value.CompareTo(nameof(IBehaviour.StateEnable)) != 0) throw new(); @@ -50,7 +46,7 @@ public class BehaviourSerializer : IEngineTypeYamlSerializer return behaviour; } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { IBehaviour behaviour = (IBehaviour)value!; diff --git a/Engine.Core/Serialization/Serializers/EngineTypeYamlSerializerBase.cs b/Engine.Core/Serialization/Serializers/EngineTypeYamlSerializerBase.cs new file mode 100644 index 0000000..76d2ffd --- /dev/null +++ b/Engine.Core/Serialization/Serializers/EngineTypeYamlSerializerBase.cs @@ -0,0 +1,28 @@ +using System; + +using YamlDotNet.Core; +using YamlDotNet.Serialization; + +namespace Syntriax.Engine.Core.Serialization; + +public abstract class EngineTypeYamlSerializerBase : IEngineTypeYamlSerializer +{ + protected const string SERIALIZED_SCALAR_NAME = "Properties"; + + public EntityRegistry EntityRegistry { get; set; } = null!; + + public bool Accepts(Type type) => typeof(T).IsAssignableFrom(type); + + public abstract T? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer); + public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + { + T? result = Read(parser, type, rootDeserializer); + + if (result is IEntity entity) + EntityRegistry.Add(entity); + + return result; + } + + public abstract void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer); +} diff --git a/Engine.Core/Serialization/Serializers/Primitives/AABBSerializer.cs b/Engine.Core/Serialization/Serializers/Primitives/AABBSerializer.cs index 2b06282..6c2dce6 100644 --- a/Engine.Core/Serialization/Serializers/Primitives/AABBSerializer.cs +++ b/Engine.Core/Serialization/Serializers/Primitives/AABBSerializer.cs @@ -6,11 +6,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class AABBSerializer : IEngineTypeYamlSerializer +public class AABBSerializer : EngineTypeYamlSerializerBase { - public bool Accepts(Type type) => type == typeof(AABB); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override AABB Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { parser.Consume(); @@ -27,7 +25,7 @@ public class AABBSerializer : IEngineTypeYamlSerializer return new AABB(lowerBoundary, upperBoundary); } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { AABB aabb = (AABB)value!; @@ -38,4 +36,5 @@ public class AABBSerializer : IEngineTypeYamlSerializer serializer(aabb.UpperBoundary, typeof(Vector2D)); emitter.Emit(new MappingEnd()); } + } diff --git a/Engine.Core/Serialization/Serializers/Primitives/CircleSerializer.cs b/Engine.Core/Serialization/Serializers/Primitives/CircleSerializer.cs index b9e4ac0..b1af49d 100644 --- a/Engine.Core/Serialization/Serializers/Primitives/CircleSerializer.cs +++ b/Engine.Core/Serialization/Serializers/Primitives/CircleSerializer.cs @@ -6,11 +6,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class CircleSerializer : IEngineTypeYamlSerializer +public class CircleSerializer : EngineTypeYamlSerializerBase { - public bool Accepts(Type type) => type == typeof(Circle); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override Circle Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { parser.Consume(); @@ -27,7 +25,7 @@ public class CircleSerializer : IEngineTypeYamlSerializer return new Circle(lowerBoundary, radius); } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { Circle circle = (Circle)value!; diff --git a/Engine.Core/Serialization/Serializers/Primitives/Line2DEquationSerializer.cs b/Engine.Core/Serialization/Serializers/Primitives/Line2DEquationSerializer.cs index c6a78cd..0a00c41 100644 --- a/Engine.Core/Serialization/Serializers/Primitives/Line2DEquationSerializer.cs +++ b/Engine.Core/Serialization/Serializers/Primitives/Line2DEquationSerializer.cs @@ -6,11 +6,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class Line2DEquationSerializer : IEngineTypeYamlSerializer +public class Line2DEquationSerializer : EngineTypeYamlSerializerBase { - public bool Accepts(Type type) => type == typeof(Line2DEquation); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override Line2DEquation Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { parser.Consume(); @@ -27,7 +25,7 @@ public class Line2DEquationSerializer : IEngineTypeYamlSerializer return new Line2DEquation(slope, offset); } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { Line2DEquation line2DEquation = (Line2DEquation)value!; diff --git a/Engine.Core/Serialization/Serializers/Primitives/Line2DSerializer.cs b/Engine.Core/Serialization/Serializers/Primitives/Line2DSerializer.cs index d264ae6..d4ddd92 100644 --- a/Engine.Core/Serialization/Serializers/Primitives/Line2DSerializer.cs +++ b/Engine.Core/Serialization/Serializers/Primitives/Line2DSerializer.cs @@ -6,11 +6,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class Line2DSerializer : IEngineTypeYamlSerializer +public class Line2DSerializer : EngineTypeYamlSerializerBase { - public bool Accepts(Type type) => type == typeof(Line2D); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override Line2D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { parser.Consume(); @@ -27,7 +25,7 @@ public class Line2DSerializer : IEngineTypeYamlSerializer return new Line2D(from, to); } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { Line2D line2D = (Line2D)value!; diff --git a/Engine.Core/Serialization/Serializers/Primitives/Projection1DSerializer.cs b/Engine.Core/Serialization/Serializers/Primitives/Projection1DSerializer.cs index e5d841b..c9ac8ef 100644 --- a/Engine.Core/Serialization/Serializers/Primitives/Projection1DSerializer.cs +++ b/Engine.Core/Serialization/Serializers/Primitives/Projection1DSerializer.cs @@ -6,11 +6,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class Projection1DSerializer : IEngineTypeYamlSerializer +public class Projection1DSerializer : EngineTypeYamlSerializerBase { - public bool Accepts(Type type) => type == typeof(Projection1D); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override Projection1D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { parser.Consume(); @@ -27,7 +25,7 @@ public class Projection1DSerializer : IEngineTypeYamlSerializer return new Projection1D(min, max); } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { Projection1D projection1D = (Projection1D)value!; diff --git a/Engine.Core/Serialization/Serializers/Primitives/QuaternionSerializer.cs b/Engine.Core/Serialization/Serializers/Primitives/QuaternionSerializer.cs index 43da5d0..02b0da4 100644 --- a/Engine.Core/Serialization/Serializers/Primitives/QuaternionSerializer.cs +++ b/Engine.Core/Serialization/Serializers/Primitives/QuaternionSerializer.cs @@ -6,13 +6,11 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class QuaternionSerializer : IEngineTypeYamlSerializer +public class QuaternionSerializer : EngineTypeYamlSerializerBase { private static readonly int SUBSTRING_START_LENGTH = nameof(Quaternion).Length + 1; - public bool Accepts(Type type) => type == typeof(Quaternion); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override Quaternion Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { string value = parser.Consume().Value; string insideParenthesis = value[SUBSTRING_START_LENGTH..^1]; @@ -20,7 +18,7 @@ public class QuaternionSerializer : IEngineTypeYamlSerializer return new Quaternion(float.Parse(values[0]), float.Parse(values[1]), float.Parse(values[2]), float.Parse(values[3])); } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { Quaternion quaternion = (Quaternion)value!; emitter.Emit(new Scalar($"{nameof(Quaternion)}({quaternion.X}, {quaternion.Y}, {quaternion.Z}, {quaternion.W})")); diff --git a/Engine.Core/Serialization/Serializers/Primitives/Shape2DSerializer.cs b/Engine.Core/Serialization/Serializers/Primitives/Shape2DSerializer.cs index 845b2af..6b0dea3 100644 --- a/Engine.Core/Serialization/Serializers/Primitives/Shape2DSerializer.cs +++ b/Engine.Core/Serialization/Serializers/Primitives/Shape2DSerializer.cs @@ -7,11 +7,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class Shape2DSerializer : IEngineTypeYamlSerializer +public class Shape2DSerializer : EngineTypeYamlSerializerBase { - public bool Accepts(Type type) => type == typeof(Shape2D); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override Shape2D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { parser.Consume(); @@ -33,7 +31,7 @@ public class Shape2DSerializer : IEngineTypeYamlSerializer return new Shape2D(vertices); } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { Shape2D shape2D = (Shape2D)value!; diff --git a/Engine.Core/Serialization/Serializers/Primitives/TriangleSerializer.cs b/Engine.Core/Serialization/Serializers/Primitives/TriangleSerializer.cs index 2a46450..86a2901 100644 --- a/Engine.Core/Serialization/Serializers/Primitives/TriangleSerializer.cs +++ b/Engine.Core/Serialization/Serializers/Primitives/TriangleSerializer.cs @@ -6,11 +6,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class TriangleSerializer : IEngineTypeYamlSerializer +public class TriangleSerializer : EngineTypeYamlSerializerBase { - public bool Accepts(Type type) => type == typeof(Triangle); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override Triangle Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { parser.Consume(); @@ -31,7 +29,7 @@ public class TriangleSerializer : IEngineTypeYamlSerializer return new Triangle(a, b, c); } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { Triangle aabb = (Triangle)value!; diff --git a/Engine.Core/Serialization/Serializers/Primitives/Vector2DSerializer.cs b/Engine.Core/Serialization/Serializers/Primitives/Vector2DSerializer.cs index 32172a3..7ef8673 100644 --- a/Engine.Core/Serialization/Serializers/Primitives/Vector2DSerializer.cs +++ b/Engine.Core/Serialization/Serializers/Primitives/Vector2DSerializer.cs @@ -6,13 +6,11 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class Vector2DSerializer : IEngineTypeYamlSerializer +public class Vector2DSerializer : EngineTypeYamlSerializerBase { private static readonly int SUBSTRING_START_LENGTH = nameof(Vector2D).Length + 1; - public bool Accepts(Type type) => type == typeof(Vector2D); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override Vector2D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { string value = parser.Consume().Value; string insideParenthesis = value[SUBSTRING_START_LENGTH..^1]; @@ -20,7 +18,7 @@ public class Vector2DSerializer : IEngineTypeYamlSerializer return new Vector2D(float.Parse(values[0]), float.Parse(values[1])); } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { Vector2D vector2D = (Vector2D)value!; emitter.Emit(new Scalar($"{nameof(Vector2D)}({vector2D.X}, {vector2D.Y})")); diff --git a/Engine.Core/Serialization/Serializers/Primitives/Vector3DSerializer.cs b/Engine.Core/Serialization/Serializers/Primitives/Vector3DSerializer.cs index 5f439d4..e67b086 100644 --- a/Engine.Core/Serialization/Serializers/Primitives/Vector3DSerializer.cs +++ b/Engine.Core/Serialization/Serializers/Primitives/Vector3DSerializer.cs @@ -6,13 +6,11 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class Vector3DSerializer : IEngineTypeYamlSerializer +public class Vector3DSerializer : EngineTypeYamlSerializerBase { private static readonly int SUBSTRING_START_LENGTH = nameof(Vector3D).Length + 1; - public bool Accepts(Type type) => type == typeof(Vector3D); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override Vector3D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { string value = parser.Consume().Value; string insideParenthesis = value[SUBSTRING_START_LENGTH..^1]; @@ -20,7 +18,7 @@ public class Vector3DSerializer : IEngineTypeYamlSerializer return new Vector3D(float.Parse(values[0]), float.Parse(values[1]), float.Parse(values[2])); } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { Vector3D vector3D = (Vector3D)value!; emitter.Emit(new Scalar($"{nameof(Vector3D)}({vector3D.X}, {vector3D.Y}, {vector3D.Z})")); diff --git a/Engine.Core/Serialization/Serializers/SerializedClassSerializer.cs b/Engine.Core/Serialization/Serializers/SerializedClassSerializer.cs index 1d936e8..7779126 100644 --- a/Engine.Core/Serialization/Serializers/SerializedClassSerializer.cs +++ b/Engine.Core/Serialization/Serializers/SerializedClassSerializer.cs @@ -10,11 +10,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class SerializedClassSerializer : IEngineTypeYamlSerializer +public class SerializedClassSerializer : EngineTypeYamlSerializerBase { - public bool Accepts(Type type) => type == typeof(SerializedClass); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override SerializedClass? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { SerializedClass serializedClass = new(); Dictionary publicDictionary = []; @@ -43,7 +41,7 @@ public class SerializedClassSerializer : IEngineTypeYamlSerializer return serializedClass; } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { SerializedClass serializedClass = (SerializedClass)value!; diff --git a/Engine.Core/Serialization/Serializers/StateEnableSerializer.cs b/Engine.Core/Serialization/Serializers/StateEnableSerializer.cs index 47eef7d..5ba8d6c 100644 --- a/Engine.Core/Serialization/Serializers/StateEnableSerializer.cs +++ b/Engine.Core/Serialization/Serializers/StateEnableSerializer.cs @@ -6,13 +6,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class StateEnableSerializer : IEngineTypeYamlSerializer +public class StateEnableSerializer : EngineTypeYamlSerializerBase { - private const string SERIALIZED_SCALAR_NAME = "Properties"; - - public bool Accepts(Type type) => typeof(IStateEnable).IsAssignableFrom(type); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override IStateEnable? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { bool enabled; @@ -27,7 +23,7 @@ public class StateEnableSerializer : IEngineTypeYamlSerializer if (parser.Consume().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0) throw new(); SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!; - stateEnable = (IStateEnable)instanceSerializedClass.CreateInstance(); + stateEnable = (IStateEnable)instanceSerializedClass.CreateInstance(EntityRegistry); parser.Consume(); @@ -36,7 +32,7 @@ public class StateEnableSerializer : IEngineTypeYamlSerializer return stateEnable; } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { IStateEnable stateEnable = (IStateEnable)value!; diff --git a/Engine.Core/Serialization/Serializers/TypeContainerSerializer.cs b/Engine.Core/Serialization/Serializers/TypeContainerSerializer.cs index 825ca49..677602a 100644 --- a/Engine.Core/Serialization/Serializers/TypeContainerSerializer.cs +++ b/Engine.Core/Serialization/Serializers/TypeContainerSerializer.cs @@ -8,11 +8,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class TypeContainerSerializer : IEngineTypeYamlSerializer +public class TypeContainerSerializer : EngineTypeYamlSerializerBase { - public bool Accepts(Type type) => type == typeof(TypeContainer); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override TypeContainer Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { parser.Consume(); @@ -30,7 +28,7 @@ public class TypeContainerSerializer : IEngineTypeYamlSerializer return new TypeContainer() { Type = typeFullName, Value = value }; } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { TypeContainer? typeContainer = (TypeContainer)value!; diff --git a/Engine.Core/Serialization/Serializers/UniverseObjectSerializer.cs b/Engine.Core/Serialization/Serializers/UniverseObjectSerializer.cs index 814e05e..7794d24 100644 --- a/Engine.Core/Serialization/Serializers/UniverseObjectSerializer.cs +++ b/Engine.Core/Serialization/Serializers/UniverseObjectSerializer.cs @@ -8,13 +8,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class UniverseObjectSerializer : IEngineTypeYamlSerializer +public class UniverseObjectSerializer : EngineTypeYamlSerializerBase { - private const string SERIALIZED_SCALAR_NAME = "Properties"; - - public bool Accepts(Type type) => typeof(IUniverseObject).IsAssignableFrom(type); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override IUniverseObject? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { string name; string id; @@ -37,7 +33,7 @@ public class UniverseObjectSerializer : IEngineTypeYamlSerializer if (parser.Consume().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0) throw new(); SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!; - universeObject = (IUniverseObject)instanceSerializedClass.CreateInstance(); + universeObject = (IUniverseObject)instanceSerializedClass.CreateInstance(EntityRegistry); if (parser.Consume().Value.CompareTo(nameof(IUniverseObject.StateEnable)) != 0) throw new(); @@ -68,7 +64,7 @@ public class UniverseObjectSerializer : IEngineTypeYamlSerializer return universeObject; } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { IUniverseObject universeObject = (IUniverseObject)value!; diff --git a/Engine.Core/Serialization/Serializers/UniverseSerializer.cs b/Engine.Core/Serialization/Serializers/UniverseSerializer.cs index 9789ba0..5c70612 100644 --- a/Engine.Core/Serialization/Serializers/UniverseSerializer.cs +++ b/Engine.Core/Serialization/Serializers/UniverseSerializer.cs @@ -8,13 +8,9 @@ using YamlDotNet.Serialization; namespace Syntriax.Engine.Core.Serialization; -public class UniverseSerializer : IEngineTypeYamlSerializer +public class UniverseSerializer : EngineTypeYamlSerializerBase { - private const string SERIALIZED_SCALAR_NAME = "Properties"; - - public bool Accepts(Type type) => typeof(IUniverse).IsAssignableFrom(type); - - public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + public override IUniverse? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { string id; @@ -31,7 +27,7 @@ public class UniverseSerializer : IEngineTypeYamlSerializer if (parser.Consume().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0) throw new(); SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!; - universe = (IUniverse)instanceSerializedClass.CreateInstance(); + universe = (IUniverse)instanceSerializedClass.CreateInstance(EntityRegistry); if (parser.Consume().Value.CompareTo(nameof(IUniverse.StateEnable)) != 0) throw new(); @@ -54,7 +50,7 @@ public class UniverseSerializer : IEngineTypeYamlSerializer return universe; } - public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { IUniverse universe = (IUniverse)value!;