using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; namespace Syntriax.Engine.Core.Serialization; public static class Serializer { private static readonly ISerializer serializer = GetSerializer(); private static ISerializer GetSerializer() { SerializerBuilder serializerBuilder = new SerializerBuilder() .WithNamingConvention(PascalCaseNamingConvention.Instance) .DisableAliases(); foreach (IEngineTypeYamlSerializer typeConverter in GetEngineYamlTypeConverters()) serializerBuilder = serializerBuilder.WithTypeConverter(typeConverter); return serializerBuilder.Build(); } 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(); } private static IEnumerable GetEngineYamlTypeConverters() { foreach (Type type in Assembly.GetExecutingAssembly().GetTypes().Where(t => typeof(IEngineTypeYamlSerializer).IsAssignableFrom(t) && t.IsClass && !t.IsAbstract)) yield return (Activator.CreateInstance(type) as IEngineTypeYamlSerializer)!; } public static string Serialize(object instance) { return serializer.Serialize(instance); } public static object Deserialize(string yaml) { EntityRegistry entityRegistry = new(); object result = GetDeserializer(entityRegistry).Deserialize(yaml)!; entityRegistry.AssignAll(); return result; } public static object Deserialize(string yaml, Type type) { EntityRegistry entityRegistry = new(); object result = GetDeserializer(entityRegistry).Deserialize(yaml, type)!; entityRegistry.AssignAll(); return result; } public static T Deserialize(string yaml) { EntityRegistry entityRegistry = new(); T result = GetDeserializer(entityRegistry).Deserialize(yaml); entityRegistry.AssignAll(); return result; } }