feat: async serializer methods
This commit is contained in:
parent
ed6969c16a
commit
0bf38234c6
@ -9,4 +9,10 @@ public interface ISerializer
|
|||||||
T Deserialize<T>(string configuration);
|
T Deserialize<T>(string configuration);
|
||||||
|
|
||||||
string Serialize(object instance);
|
string Serialize(object instance);
|
||||||
|
|
||||||
|
ProgressiveTask<object> DeserializeAsync(string configuration);
|
||||||
|
ProgressiveTask<object> DeserializeAsync(string configuration, Type type);
|
||||||
|
ProgressiveTask<T> DeserializeAsync<T>(string configuration);
|
||||||
|
|
||||||
|
ProgressiveTask<string> SerializeAsync(object instance);
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using Syntriax.Engine.Core;
|
||||||
using Syntriax.Engine.Core.Serialization;
|
using Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
@ -8,4 +9,5 @@ public interface IEngineTypeYamlConverter : IYamlTypeConverter
|
|||||||
{
|
{
|
||||||
YamlSerializer Serializer { get; set; }
|
YamlSerializer Serializer { get; set; }
|
||||||
EntityRegistry EntityRegistry { get; set; }
|
EntityRegistry EntityRegistry { get; set; }
|
||||||
|
IProgressionTracker ProgressionTracker { get; set; }
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,9 @@ public class BehaviourControllerConverter : EngineTypeYamlSerializerBase<IBehavi
|
|||||||
|
|
||||||
public override IBehaviourController? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override IBehaviourController? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
||||||
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Reading behaviour controller");
|
||||||
|
|
||||||
string id;
|
string id;
|
||||||
|
|
||||||
IBehaviourController behaviourController;
|
IBehaviourController behaviourController;
|
||||||
@ -32,6 +35,7 @@ public class BehaviourControllerConverter : EngineTypeYamlSerializerBase<IBehavi
|
|||||||
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .5f : ProgressionTracker.Progression, $"Creating {instanceSerializedClass.Type}");
|
||||||
behaviourController = (IBehaviourController)instanceSerializedClass.CreateInstance(EntityRegistry);
|
behaviourController = (IBehaviourController)instanceSerializedClass.CreateInstance(EntityRegistry);
|
||||||
|
|
||||||
string value = parser.Consume<Scalar>().Value;
|
string value = parser.Consume<Scalar>().Value;
|
||||||
@ -53,6 +57,7 @@ public class BehaviourControllerConverter : EngineTypeYamlSerializerBase<IBehavi
|
|||||||
foreach (IBehaviour behaviour in behaviours)
|
foreach (IBehaviour behaviour in behaviours)
|
||||||
behaviourController.AddBehaviour(behaviour);
|
behaviourController.AddBehaviour(behaviour);
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Created {instanceSerializedClass.Type}");
|
||||||
return behaviourController;
|
return behaviourController;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,6 +65,9 @@ public class BehaviourControllerConverter : EngineTypeYamlSerializerBase<IBehavi
|
|||||||
{
|
{
|
||||||
IBehaviourController behaviourController = (IBehaviourController)value!;
|
IBehaviourController behaviourController = (IBehaviourController)value!;
|
||||||
|
|
||||||
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Serializing behaviour controller");
|
||||||
|
|
||||||
emitter.Emit(new MappingStart());
|
emitter.Emit(new MappingStart());
|
||||||
|
|
||||||
emitter.Emit(new Scalar(nameof(IBehaviourController.Id)));
|
emitter.Emit(new Scalar(nameof(IBehaviourController.Id)));
|
||||||
@ -74,6 +82,7 @@ public class BehaviourControllerConverter : EngineTypeYamlSerializerBase<IBehavi
|
|||||||
emitter.Emit(new Scalar(BEHAVIOURS_SCALAR_NAME));
|
emitter.Emit(new Scalar(BEHAVIOURS_SCALAR_NAME));
|
||||||
serializer(behaviourController.GetBehaviours<IBehaviour>().Where(b => !b.GetType().HasAttribute<IgnoreSerializationAttribute>()));
|
serializer(behaviourController.GetBehaviours<IBehaviour>().Where(b => !b.GetType().HasAttribute<IgnoreSerializationAttribute>()));
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serialized behaviour controller");
|
||||||
emitter.Emit(new MappingEnd());
|
emitter.Emit(new MappingEnd());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,9 @@ public class BehaviourConverter : EngineTypeYamlSerializerBase<IBehaviour>
|
|||||||
{
|
{
|
||||||
public override IBehaviour? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override IBehaviour? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
||||||
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Reading behaviour information");
|
||||||
|
|
||||||
string id;
|
string id;
|
||||||
int priority;
|
int priority;
|
||||||
|
|
||||||
@ -32,6 +35,7 @@ public class BehaviourConverter : EngineTypeYamlSerializerBase<IBehaviour>
|
|||||||
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .5f : ProgressionTracker.Progression, $"Creating {instanceSerializedClass.Type}");
|
||||||
behaviour = (IBehaviour)instanceSerializedClass.CreateInstance(EntityRegistry);
|
behaviour = (IBehaviour)instanceSerializedClass.CreateInstance(EntityRegistry);
|
||||||
|
|
||||||
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IBehaviour.StateEnable)) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IBehaviour.StateEnable)) != 0)
|
||||||
@ -46,6 +50,7 @@ public class BehaviourConverter : EngineTypeYamlSerializerBase<IBehaviour>
|
|||||||
stateEnable.Assign(behaviour);
|
stateEnable.Assign(behaviour);
|
||||||
behaviour.Assign(stateEnable);
|
behaviour.Assign(stateEnable);
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Created {instanceSerializedClass.Type}");
|
||||||
return behaviour;
|
return behaviour;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,6 +58,9 @@ public class BehaviourConverter : EngineTypeYamlSerializerBase<IBehaviour>
|
|||||||
{
|
{
|
||||||
IBehaviour behaviour = (IBehaviour)value!;
|
IBehaviour behaviour = (IBehaviour)value!;
|
||||||
|
|
||||||
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Serializing behaviour");
|
||||||
|
|
||||||
emitter.Emit(new MappingStart());
|
emitter.Emit(new MappingStart());
|
||||||
|
|
||||||
emitter.Emit(new Scalar(nameof(IBehaviour.Id)));
|
emitter.Emit(new Scalar(nameof(IBehaviour.Id)));
|
||||||
@ -67,6 +75,7 @@ public class BehaviourConverter : EngineTypeYamlSerializerBase<IBehaviour>
|
|||||||
emitter.Emit(new Scalar(nameof(IBehaviour.StateEnable)));
|
emitter.Emit(new Scalar(nameof(IBehaviour.StateEnable)));
|
||||||
serializer(behaviour.StateEnable);
|
serializer(behaviour.StateEnable);
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serialized behaviour");
|
||||||
emitter.Emit(new MappingEnd());
|
emitter.Emit(new MappingEnd());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ public abstract class EngineTypeYamlSerializerBase<T> : IEngineTypeYamlConverter
|
|||||||
|
|
||||||
public EntityRegistry EntityRegistry { get; set; } = null!;
|
public EntityRegistry EntityRegistry { get; set; } = null!;
|
||||||
public YamlSerializer Serializer { get; set; } = null!;
|
public YamlSerializer Serializer { get; set; } = null!;
|
||||||
|
public IProgressionTracker ProgressionTracker { get; set; } = null!;
|
||||||
|
|
||||||
public bool Accepts(Type type) => typeof(T).IsAssignableFrom(type);
|
public bool Accepts(Type type) => typeof(T).IsAssignableFrom(type);
|
||||||
|
|
||||||
|
@ -2,8 +2,9 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
using Syntriax.Engine.Core.Serialization;
|
using Syntriax.Engine.Core;
|
||||||
using Syntriax.Engine.Core.Factory;
|
using Syntriax.Engine.Core.Factory;
|
||||||
|
using Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
@ -15,6 +16,9 @@ public class SerializedClassConverter : EngineTypeYamlSerializerBase<SerializedC
|
|||||||
{
|
{
|
||||||
public override SerializedClass? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override SerializedClass? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
||||||
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .1f : ProgressionTracker.Progression, $"Reading class");
|
||||||
|
|
||||||
SerializedClass serializedClass = new();
|
SerializedClass serializedClass = new();
|
||||||
Dictionary<string, TypeContainer> publicDictionary = [];
|
Dictionary<string, TypeContainer> publicDictionary = [];
|
||||||
Dictionary<string, TypeContainer> privateDictionary = [];
|
Dictionary<string, TypeContainer> privateDictionary = [];
|
||||||
@ -39,6 +43,7 @@ public class SerializedClassConverter : EngineTypeYamlSerializerBase<SerializedC
|
|||||||
foreach ((string key, TypeContainer typeContainer) in privateDictionary)
|
foreach ((string key, TypeContainer typeContainer) in privateDictionary)
|
||||||
serializedClass.Private.Add(key, Serializer.InternalDeserialize(typeContainer.Value!.ToString()!, TypeFactory.GetType(typeContainer.Type)));
|
serializedClass.Private.Add(key, Serializer.InternalDeserialize(typeContainer.Value!.ToString()!, TypeFactory.GetType(typeContainer.Type)));
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Read {serializedClass.Type}");
|
||||||
return serializedClass;
|
return serializedClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,6 +51,9 @@ public class SerializedClassConverter : EngineTypeYamlSerializerBase<SerializedC
|
|||||||
{
|
{
|
||||||
SerializedClass serializedClass = (SerializedClass)value!;
|
SerializedClass serializedClass = (SerializedClass)value!;
|
||||||
|
|
||||||
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Serializing {serializedClass.Type}");
|
||||||
|
|
||||||
Dictionary<string, TypeContainer> publics = [];
|
Dictionary<string, TypeContainer> publics = [];
|
||||||
Dictionary<string, TypeContainer> privates = [];
|
Dictionary<string, TypeContainer> privates = [];
|
||||||
|
|
||||||
@ -72,6 +80,7 @@ public class SerializedClassConverter : EngineTypeYamlSerializerBase<SerializedC
|
|||||||
serializer(privates);
|
serializer(privates);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serialized {serializedClass.Type}");
|
||||||
emitter.Emit(new MappingEnd());
|
emitter.Emit(new MappingEnd());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,9 @@ public class StateEnableConverter : EngineTypeYamlSerializerBase<IStateEnable>
|
|||||||
{
|
{
|
||||||
public override IStateEnable? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override IStateEnable? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
||||||
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Reading state enable");
|
||||||
|
|
||||||
bool enabled;
|
bool enabled;
|
||||||
|
|
||||||
IStateEnable stateEnable;
|
IStateEnable stateEnable;
|
||||||
@ -32,6 +35,7 @@ public class StateEnableConverter : EngineTypeYamlSerializerBase<IStateEnable>
|
|||||||
|
|
||||||
stateEnable.Enabled = enabled;
|
stateEnable.Enabled = enabled;
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Read state enable");
|
||||||
return stateEnable;
|
return stateEnable;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,6 +43,9 @@ public class StateEnableConverter : EngineTypeYamlSerializerBase<IStateEnable>
|
|||||||
{
|
{
|
||||||
IStateEnable stateEnable = (IStateEnable)value!;
|
IStateEnable stateEnable = (IStateEnable)value!;
|
||||||
|
|
||||||
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Serializing state enable");
|
||||||
|
|
||||||
emitter.Emit(new MappingStart());
|
emitter.Emit(new MappingStart());
|
||||||
|
|
||||||
emitter.Emit(new Scalar(nameof(IStateEnable.Enabled)));
|
emitter.Emit(new Scalar(nameof(IStateEnable.Enabled)));
|
||||||
@ -47,6 +54,7 @@ public class StateEnableConverter : EngineTypeYamlSerializerBase<IStateEnable>
|
|||||||
emitter.Emit(new Scalar(SERIALIZED_SCALAR_NAME));
|
emitter.Emit(new Scalar(SERIALIZED_SCALAR_NAME));
|
||||||
serializer(new SerializedClass(stateEnable));
|
serializer(new SerializedClass(stateEnable));
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serialized state enable");
|
||||||
emitter.Emit(new MappingEnd());
|
emitter.Emit(new MappingEnd());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,9 @@ public class UniverseConverter : EngineTypeYamlSerializerBase<IUniverse>
|
|||||||
{
|
{
|
||||||
public override IUniverse? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override IUniverse? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
||||||
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
|
ProgressionTracker.Set(isTrackingController ? 0.1f : ProgressionTracker.Progression, "Reading universe");
|
||||||
|
|
||||||
string id;
|
string id;
|
||||||
|
|
||||||
IUniverse universe;
|
IUniverse universe;
|
||||||
@ -30,12 +33,14 @@ public class UniverseConverter : EngineTypeYamlSerializerBase<IUniverse>
|
|||||||
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .2f : ProgressionTracker.Progression, $"Creating {instanceSerializedClass.Type}");
|
||||||
universe = (IUniverse)instanceSerializedClass.CreateInstance(EntityRegistry);
|
universe = (IUniverse)instanceSerializedClass.CreateInstance(EntityRegistry);
|
||||||
|
|
||||||
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverse.StateEnable)) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverse.StateEnable)) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
stateEnable = (IStateEnable)rootDeserializer(typeof(IStateEnable))!;
|
stateEnable = (IStateEnable)rootDeserializer(typeof(IStateEnable))!;
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .5f : ProgressionTracker.Progression, $"Reading universe objects");
|
||||||
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverse.UniverseObjects)) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverse.UniverseObjects)) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
universeObjects = (List<IUniverseObject>)rootDeserializer(typeof(List<IUniverseObject>))!;
|
universeObjects = (List<IUniverseObject>)rootDeserializer(typeof(List<IUniverseObject>))!;
|
||||||
@ -47,9 +52,16 @@ public class UniverseConverter : EngineTypeYamlSerializerBase<IUniverse>
|
|||||||
stateEnable.Assign(universe);
|
stateEnable.Assign(universe);
|
||||||
universe.Assign(stateEnable);
|
universe.Assign(stateEnable);
|
||||||
|
|
||||||
foreach (IUniverseObject uo in universeObjects)
|
ProgressionTracker.Set(isTrackingController ? .9f : ProgressionTracker.Progression, "Registering universe objects");
|
||||||
universe.Register(uo);
|
for (int i = 0; i < universeObjects.Count; i++)
|
||||||
|
{
|
||||||
|
IUniverseObject uo = universeObjects[i];
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .9f + .1f * ((float)i / universeObjects.Count) : ProgressionTracker.Progression, $"Registering {uo.Name}");
|
||||||
|
|
||||||
|
universe.Register(uo);
|
||||||
|
}
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Created {instanceSerializedClass.Type}");
|
||||||
return universe;
|
return universe;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,16 +69,10 @@ public class UniverseConverter : EngineTypeYamlSerializerBase<IUniverse>
|
|||||||
{
|
{
|
||||||
IUniverse universe = (IUniverse)value!;
|
IUniverse universe = (IUniverse)value!;
|
||||||
|
|
||||||
IEnumerable<IUniverseObject> rootUniverseObjects = universe.UniverseObjects
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
.Select(uo =>
|
ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Serializing universe");
|
||||||
{
|
|
||||||
IUniverseObject root = uo;
|
IEnumerable<IUniverseObject> rootUniverseObjects = universe.UniverseObjects.Where(uo => uo.Parent is null);
|
||||||
while (root.Parent is IUniverseObject parent)
|
|
||||||
root = parent;
|
|
||||||
return root;
|
|
||||||
})
|
|
||||||
.Where(uo => !uo.GetType().HasAttribute<IgnoreSerializationAttribute>())
|
|
||||||
.Distinct();
|
|
||||||
|
|
||||||
emitter.Emit(new MappingStart());
|
emitter.Emit(new MappingStart());
|
||||||
|
|
||||||
@ -82,6 +88,7 @@ public class UniverseConverter : EngineTypeYamlSerializerBase<IUniverse>
|
|||||||
emitter.Emit(new Scalar(nameof(IUniverse.UniverseObjects)));
|
emitter.Emit(new Scalar(nameof(IUniverse.UniverseObjects)));
|
||||||
serializer(rootUniverseObjects);
|
serializer(rootUniverseObjects);
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serialized universe");
|
||||||
emitter.Emit(new MappingEnd());
|
emitter.Emit(new MappingEnd());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,8 @@ public class UniverseObjectSerializer : EngineTypeYamlSerializerBase<IUniverseOb
|
|||||||
{
|
{
|
||||||
public override IUniverseObject? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override IUniverseObject? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
||||||
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
|
|
||||||
string name;
|
string name;
|
||||||
string id;
|
string id;
|
||||||
|
|
||||||
@ -28,6 +30,7 @@ public class UniverseObjectSerializer : EngineTypeYamlSerializerBase<IUniverseOb
|
|||||||
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverseObject.Name)) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverseObject.Name)) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
name = parser.Consume<Scalar>().Value;
|
name = parser.Consume<Scalar>().Value;
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .1f : ProgressionTracker.Progression, $"Reading {name}");
|
||||||
|
|
||||||
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverseObject.Id)) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverseObject.Id)) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
@ -36,6 +39,7 @@ public class UniverseObjectSerializer : EngineTypeYamlSerializerBase<IUniverseOb
|
|||||||
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .3f : ProgressionTracker.Progression, $"Creating {instanceSerializedClass.Type}");
|
||||||
universeObject = (IUniverseObject)instanceSerializedClass.CreateInstance(EntityRegistry);
|
universeObject = (IUniverseObject)instanceSerializedClass.CreateInstance(EntityRegistry);
|
||||||
|
|
||||||
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverseObject.StateEnable)) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverseObject.StateEnable)) != 0)
|
||||||
@ -64,6 +68,7 @@ public class UniverseObjectSerializer : EngineTypeYamlSerializerBase<IUniverseOb
|
|||||||
foreach (IUniverseObject child in children)
|
foreach (IUniverseObject child in children)
|
||||||
universeObject.AddChild(child);
|
universeObject.AddChild(child);
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .3f : ProgressionTracker.Progression, $"Created {name}");
|
||||||
return universeObject;
|
return universeObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,6 +76,9 @@ public class UniverseObjectSerializer : EngineTypeYamlSerializerBase<IUniverseOb
|
|||||||
{
|
{
|
||||||
IUniverseObject universeObject = (IUniverseObject)value!;
|
IUniverseObject universeObject = (IUniverseObject)value!;
|
||||||
|
|
||||||
|
bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
|
||||||
|
ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Serializing universe object");
|
||||||
|
|
||||||
emitter.Emit(new MappingStart());
|
emitter.Emit(new MappingStart());
|
||||||
|
|
||||||
emitter.Emit(new Scalar(nameof(IUniverseObject.Name)));
|
emitter.Emit(new Scalar(nameof(IUniverseObject.Name)));
|
||||||
@ -91,6 +99,7 @@ public class UniverseObjectSerializer : EngineTypeYamlSerializerBase<IUniverseOb
|
|||||||
emitter.Emit(new Scalar(nameof(IUniverseObject.Children)));
|
emitter.Emit(new Scalar(nameof(IUniverseObject.Children)));
|
||||||
serializer(universeObject.Children.Where(c => !c.GetType().HasAttribute<IgnoreSerializationAttribute>()));
|
serializer(universeObject.Children.Where(c => !c.GetType().HasAttribute<IgnoreSerializationAttribute>()));
|
||||||
|
|
||||||
|
ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serializing universe object");
|
||||||
emitter.Emit(new MappingEnd());
|
emitter.Emit(new MappingEnd());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class SerializerInProgressException() : Exception("There's already a running deserialization in progress.");
|
@ -2,7 +2,9 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
using Syntriax.Engine.Core.Serialization;
|
using Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
@ -16,10 +18,14 @@ public class YamlSerializer : Core.Serialization.ISerializer
|
|||||||
private readonly YamlDotNet.Serialization.IDeserializer deserializer = null!;
|
private readonly YamlDotNet.Serialization.IDeserializer deserializer = null!;
|
||||||
|
|
||||||
private readonly EntityRegistry entityRegistry = null!;
|
private readonly EntityRegistry entityRegistry = null!;
|
||||||
|
private readonly IProgressionTracker progressionTracker = null!;
|
||||||
|
|
||||||
|
private readonly System.Threading.Lock Lock = new();
|
||||||
|
|
||||||
public YamlSerializer()
|
public YamlSerializer()
|
||||||
{
|
{
|
||||||
entityRegistry = new();
|
entityRegistry = new();
|
||||||
|
progressionTracker = new ProgressionTracker();
|
||||||
|
|
||||||
SerializerBuilder serializerBuilder = new SerializerBuilder()
|
SerializerBuilder serializerBuilder = new SerializerBuilder()
|
||||||
.WithNamingConvention(PascalCaseNamingConvention.Instance)
|
.WithNamingConvention(PascalCaseNamingConvention.Instance)
|
||||||
@ -32,6 +38,7 @@ public class YamlSerializer : Core.Serialization.ISerializer
|
|||||||
{
|
{
|
||||||
typeConverter.Serializer = this;
|
typeConverter.Serializer = this;
|
||||||
typeConverter.EntityRegistry = entityRegistry;
|
typeConverter.EntityRegistry = entityRegistry;
|
||||||
|
typeConverter.ProgressionTracker = progressionTracker;
|
||||||
|
|
||||||
deserializerBuilder = deserializerBuilder.WithTypeConverter(typeConverter);
|
deserializerBuilder = deserializerBuilder.WithTypeConverter(typeConverter);
|
||||||
serializerBuilder = serializerBuilder.WithTypeConverter(typeConverter);
|
serializerBuilder = serializerBuilder.WithTypeConverter(typeConverter);
|
||||||
@ -49,35 +56,87 @@ public class YamlSerializer : Core.Serialization.ISerializer
|
|||||||
|
|
||||||
public string Serialize(object instance)
|
public string Serialize(object instance)
|
||||||
{
|
{
|
||||||
return serializer.Serialize(instance);
|
lock (Lock)
|
||||||
|
{
|
||||||
|
return serializer.Serialize(instance);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Deserialize(string yaml)
|
public object Deserialize(string configuration)
|
||||||
{
|
{
|
||||||
entityRegistry.Reset();
|
lock (Lock)
|
||||||
object result = deserializer.Deserialize(yaml)!;
|
{
|
||||||
entityRegistry.AssignAll();
|
entityRegistry.Reset();
|
||||||
return result;
|
object result = deserializer.Deserialize(configuration)!;
|
||||||
|
entityRegistry.AssignAll();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Deserialize(string yaml, Type type)
|
public object Deserialize(string configuration, Type type)
|
||||||
{
|
{
|
||||||
entityRegistry.Reset();
|
lock (Lock)
|
||||||
object result = deserializer.Deserialize(yaml, type)!;
|
{
|
||||||
entityRegistry.AssignAll();
|
entityRegistry.Reset();
|
||||||
return result;
|
object result = deserializer.Deserialize(configuration, type)!;
|
||||||
|
entityRegistry.AssignAll();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public T Deserialize<T>(string yaml)
|
public T Deserialize<T>(string configuration)
|
||||||
{
|
{
|
||||||
entityRegistry.Reset();
|
lock (Lock)
|
||||||
T result = deserializer.Deserialize<T>(yaml);
|
{
|
||||||
entityRegistry.AssignAll();
|
entityRegistry.Reset();
|
||||||
return result;
|
T result = deserializer.Deserialize<T>(configuration);
|
||||||
|
entityRegistry.AssignAll();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal object InternalDeserialize(string yaml, Type type)
|
public ProgressiveTask<object> DeserializeAsync(string configuration)
|
||||||
{
|
{
|
||||||
return deserializer.Deserialize(yaml, type)!;
|
lock (Lock)
|
||||||
|
{
|
||||||
|
progressionTracker.Reset();
|
||||||
|
Task<object> task = Task.Run(() => Deserialize(configuration));
|
||||||
|
return new ProgressiveTask<object>(progressionTracker, task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProgressiveTask<object> DeserializeAsync(string configuration, Type type)
|
||||||
|
{
|
||||||
|
lock (Lock)
|
||||||
|
{
|
||||||
|
progressionTracker.Reset();
|
||||||
|
Task<object> task = Task.Run(() => Deserialize(configuration, type));
|
||||||
|
return new ProgressiveTask<object>(progressionTracker, task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProgressiveTask<T> DeserializeAsync<T>(string configuration)
|
||||||
|
{
|
||||||
|
lock (Lock)
|
||||||
|
{
|
||||||
|
progressionTracker.Reset();
|
||||||
|
Task<T> task = Task.Run(() => Deserialize<T>(configuration));
|
||||||
|
return new ProgressiveTask<T>(progressionTracker, task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProgressiveTask<string> SerializeAsync(object instance)
|
||||||
|
{
|
||||||
|
lock (Lock)
|
||||||
|
{
|
||||||
|
progressionTracker.Reset();
|
||||||
|
Task<string> task = Task.Run(() => Serialize(instance));
|
||||||
|
return new ProgressiveTask<string>(progressionTracker, task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal object InternalDeserialize(string configuration, Type type)
|
||||||
|
{
|
||||||
|
return deserializer.Deserialize(configuration, type)!;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user