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 readonly IDeserializer deserializer = GetDeserializer(); private static IDeserializer GetDeserializer() { DeserializerBuilder serializerBuilder = new DeserializerBuilder() .WithNamingConvention(PascalCaseNamingConvention.Instance); foreach (IEngineTypeYamlSerializer typeConverter in GetEngineYamlTypeConverters()) 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) { return deserializer.Deserialize(yaml)!; } public static object Deserialize(string yaml, Type type) { return deserializer.Deserialize(yaml, type)!; } public static T Deserialize(string yaml) { return deserializer.Deserialize(yaml); } }