feat: entity register for serialized entity references

This commit is contained in:
Syntriax 2025-04-30 19:18:12 +03:00
parent 4c41870732
commit d2ca85568f
22 changed files with 185 additions and 113 deletions

View File

@ -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<string, Action<IEntity>?> assignCallbacks = [];
private readonly Dictionary<string, IEntity> registeredEntities = [];
public IReadOnlyDictionary<string, IEntity> RegisteredEntities => registeredEntities;
public void Add(IEntity entity)
{
if (registeredEntities.TryAdd(entity.Id, entity))
OnEntityRegistered?.InvokeSafe(this, entity);
}
public void QueueAssign(string id, Action<IEntity> setMethod)
{
assignCallbacks.TryAdd(id, null);
assignCallbacks[id] = assignCallbacks[id] + setMethod;
}
public void AssignAll()
{
foreach ((string id, Action<IEntity>? action) in assignCallbacks)
action?.InvokeSafe(registeredEntities[id]);
}
public delegate void EntityRegisteredEventHandler(EntityRegistry sender, IEntity entity);
}

View File

@ -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);
}
}

View File

@ -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<T>(string yaml)
{
return deserializer.Deserialize<T>(yaml);
EntityRegistry entityRegistry = new();
T result = GetDeserializer(entityRegistry).Deserialize<T>(yaml);
entityRegistry.AssignAll();
return result;
}
}

View File

@ -2,4 +2,7 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public interface IEngineTypeYamlSerializer : IYamlTypeConverter;
public interface IEngineTypeYamlSerializer : IYamlTypeConverter
{
EntityRegistry EntityRegistry { get; set; }
}

View File

@ -8,14 +8,11 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class BehaviourControllerSerializer : IEngineTypeYamlSerializer
public class BehaviourControllerSerializer : EngineTypeYamlSerializerBase<IBehaviourController>
{
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<Scalar>().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<Scalar>().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!;

View File

@ -6,13 +6,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class BehaviourSerializer : IEngineTypeYamlSerializer
public class BehaviourSerializer : EngineTypeYamlSerializerBase<IBehaviour>
{
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<Scalar>().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<Scalar>().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!;

View File

@ -0,0 +1,28 @@
using System;
using YamlDotNet.Core;
using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public abstract class EngineTypeYamlSerializerBase<T> : 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);
}

View File

@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class AABBSerializer : IEngineTypeYamlSerializer
public class AABBSerializer : EngineTypeYamlSerializerBase<AABB>
{
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<MappingStart>();
@ -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());
}
}

View File

@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class CircleSerializer : IEngineTypeYamlSerializer
public class CircleSerializer : EngineTypeYamlSerializerBase<Circle>
{
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<MappingStart>();
@ -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!;

View File

@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class Line2DEquationSerializer : IEngineTypeYamlSerializer
public class Line2DEquationSerializer : EngineTypeYamlSerializerBase<Line2DEquation>
{
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<MappingStart>();
@ -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!;

View File

@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class Line2DSerializer : IEngineTypeYamlSerializer
public class Line2DSerializer : EngineTypeYamlSerializerBase<Line2D>
{
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<MappingStart>();
@ -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!;

View File

@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class Projection1DSerializer : IEngineTypeYamlSerializer
public class Projection1DSerializer : EngineTypeYamlSerializerBase<Projection1D>
{
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<MappingStart>();
@ -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!;

View File

@ -6,13 +6,11 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class QuaternionSerializer : IEngineTypeYamlSerializer
public class QuaternionSerializer : EngineTypeYamlSerializerBase<Quaternion>
{
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<Scalar>().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})"));

View File

@ -7,11 +7,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class Shape2DSerializer : IEngineTypeYamlSerializer
public class Shape2DSerializer : EngineTypeYamlSerializerBase<Shape2D>
{
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<MappingStart>();
@ -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!;

View File

@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class TriangleSerializer : IEngineTypeYamlSerializer
public class TriangleSerializer : EngineTypeYamlSerializerBase<Triangle>
{
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<MappingStart>();
@ -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!;

View File

@ -6,13 +6,11 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class Vector2DSerializer : IEngineTypeYamlSerializer
public class Vector2DSerializer : EngineTypeYamlSerializerBase<Vector2D>
{
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<Scalar>().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})"));

View File

@ -6,13 +6,11 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class Vector3DSerializer : IEngineTypeYamlSerializer
public class Vector3DSerializer : EngineTypeYamlSerializerBase<Vector3D>
{
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<Scalar>().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})"));

View File

@ -10,11 +10,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class SerializedClassSerializer : IEngineTypeYamlSerializer
public class SerializedClassSerializer : EngineTypeYamlSerializerBase<SerializedClass>
{
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<string, TypeContainer> 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!;

View File

@ -6,13 +6,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class StateEnableSerializer : IEngineTypeYamlSerializer
public class StateEnableSerializer : EngineTypeYamlSerializerBase<IStateEnable>
{
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<Scalar>().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<MappingEnd>();
@ -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!;

View File

@ -8,11 +8,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class TypeContainerSerializer : IEngineTypeYamlSerializer
public class TypeContainerSerializer : EngineTypeYamlSerializerBase<TypeContainer>
{
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<MappingStart>();
@ -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!;

View File

@ -8,13 +8,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class UniverseObjectSerializer : IEngineTypeYamlSerializer
public class UniverseObjectSerializer : EngineTypeYamlSerializerBase<IUniverseObject>
{
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<Scalar>().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<Scalar>().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!;

View File

@ -8,13 +8,9 @@ using YamlDotNet.Serialization;
namespace Syntriax.Engine.Core.Serialization;
public class UniverseSerializer : IEngineTypeYamlSerializer
public class UniverseSerializer : EngineTypeYamlSerializerBase<IUniverse>
{
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<Scalar>().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<Scalar>().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!;