using System.Reflection; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; namespace Syntriax.Engine.Serialization; public static class Serializer { private static readonly ISerializer serializer = GetSerializer(); private static ISerializer GetSerializer(EntityFinder? entityFinder = null) { SerializerBuilder serializerBuilder = new SerializerBuilder() .WithNamingConvention(PascalCaseNamingConvention.Instance) .DisableAliases(); foreach (IEngineTypeYamlConverter typeConverter in GetEngineYamlTypeConverters()) serializerBuilder = serializerBuilder.WithTypeConverter(typeConverter); if (entityFinder is not null) serializerBuilder = serializerBuilder.WithTypeConverter(new EntityConverter(entityFinder.Entities)); return serializerBuilder.Build(); } private static readonly IDeserializer deserializer = GetDeserializer(); private static IDeserializer GetDeserializer() { DeserializerBuilder serializerBuilder = new DeserializerBuilder() .WithNamingConvention(PascalCaseNamingConvention.Instance); foreach (IEngineTypeYamlConverter typeConverter in GetEngineYamlTypeConverters()) serializerBuilder = serializerBuilder.WithTypeConverter(typeConverter); return serializerBuilder.Build(); } private static IEnumerable GetEngineYamlTypeConverters() { foreach (Type type in Assembly.GetExecutingAssembly().GetTypes().Where(t => typeof(IEngineTypeYamlConverter).IsAssignableFrom(t) && t.IsClass && !t.IsAbstract)) yield return (Activator.CreateInstance(type) as IEngineTypeYamlConverter)!; } public static string Serialize(object instance) { EntityFinder entityFinder = new(); entityFinder.FindEntitiesUnder(instance); ISerializer serializer = GetSerializer(entityFinder); return serializer.Serialize(entityFinder.Entities); } public static object Deserialize(string yaml) { return deserializer.Deserialize(yaml)!; } public static T Deserialize(string yaml) { return deserializer.Deserialize(yaml); } }