59 lines
1.9 KiB
C#

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 (IEngineTypeYamlConverter 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 (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)
{
return serializer.Serialize(instance);
}
public static object Deserialize(string yaml)
{
return deserializer.Deserialize(yaml)!;
}
public static T Deserialize<T>(string yaml)
{
return deserializer.Deserialize<T>(yaml);
}
}