feat: entity register for serialized entity references
This commit is contained in:
parent
4c41870732
commit
d2ca85568f
35
Engine.Core/Serialization/EntityReference.cs
Normal file
35
Engine.Core/Serialization/EntityReference.cs
Normal 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);
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -2,4 +2,7 @@ using YamlDotNet.Serialization;
|
||||
|
||||
namespace Syntriax.Engine.Core.Serialization;
|
||||
|
||||
public interface IEngineTypeYamlSerializer : IYamlTypeConverter;
|
||||
public interface IEngineTypeYamlSerializer : IYamlTypeConverter
|
||||
{
|
||||
EntityRegistry EntityRegistry { get; set; }
|
||||
}
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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);
|
||||
}
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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})"));
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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})"));
|
||||
|
@ -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})"));
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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!;
|
||||
|
||||
|
@ -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!;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user