61 lines
2.2 KiB
C#
61 lines
2.2 KiB
C#
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<IEngineTypeYamlConverter> 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<T>(string yaml)
|
|
{
|
|
return deserializer.Deserialize<T>(yaml);
|
|
}
|
|
}
|