wip: Serialization
This commit is contained in:
		
							
								
								
									
										62
									
								
								Engine.Serialization/BehaviourYamlConverter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								Engine.Serialization/BehaviourYamlConverter.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
using System;
 | 
			
		||||
 | 
			
		||||
using Engine.Serialization.DTOs;
 | 
			
		||||
 | 
			
		||||
using YamlDotNet.Core;
 | 
			
		||||
using YamlDotNet.Core.Events;
 | 
			
		||||
using YamlDotNet.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace Engine.Serialization;
 | 
			
		||||
 | 
			
		||||
internal class BehaviourYamlConverter : IYamlTypeConverter
 | 
			
		||||
{
 | 
			
		||||
    public bool Accepts(Type type) => type == typeof(BehaviourDTO);
 | 
			
		||||
 | 
			
		||||
    public object ReadYaml(IParser parser, Type type)
 | 
			
		||||
    {
 | 
			
		||||
        if (parser.Current is not MappingStart)
 | 
			
		||||
            throw new InvalidOperationException("Expected MappingStart");
 | 
			
		||||
 | 
			
		||||
        parser.MoveNext();
 | 
			
		||||
        var behaviour = new BehaviourDTO();
 | 
			
		||||
        while (parser.Current != null && parser.Current is not MappingEnd)
 | 
			
		||||
        {
 | 
			
		||||
            var propertyName = ((Scalar)parser.Current).Value;
 | 
			
		||||
            parser.MoveNext();
 | 
			
		||||
            switch (propertyName)
 | 
			
		||||
            {
 | 
			
		||||
                case nameof(BehaviourDTO.ClassName):
 | 
			
		||||
                    behaviour.ClassName = ((Scalar)parser.Current).Value;
 | 
			
		||||
                    break;
 | 
			
		||||
                case nameof(BehaviourDTO.Priority):
 | 
			
		||||
                    behaviour.Priority = int.Parse(((Scalar)parser.Current).Value);
 | 
			
		||||
                    break;
 | 
			
		||||
                case nameof(BehaviourDTO.StateEnable):
 | 
			
		||||
                    behaviour.StateEnable = (StateEnableDTO)(new StateEnableYamlConverter().ReadYaml(parser, typeof(StateEnableDTO)) ?? new Exception());
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
            parser.MoveNext();
 | 
			
		||||
        }
 | 
			
		||||
        return behaviour;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void WriteYaml(IEmitter emitter, object? value, Type type)
 | 
			
		||||
    {
 | 
			
		||||
        var behaviour = (BehaviourDTO)(value ?? throw new Exception());
 | 
			
		||||
 | 
			
		||||
        StateEnableYamlConverter stateEnableYamlConverter = new();
 | 
			
		||||
 | 
			
		||||
        emitter.Emit(new MappingStart());
 | 
			
		||||
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(BehaviourDTO.ClassName)));
 | 
			
		||||
        emitter.Emit(new Scalar(behaviour.ClassName.ToString()));
 | 
			
		||||
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(BehaviourDTO.Priority)));
 | 
			
		||||
        emitter.Emit(new Scalar(behaviour.Priority.ToString()));
 | 
			
		||||
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(BehaviourDTO.StateEnable)));
 | 
			
		||||
        stateEnableYamlConverter.WriteYaml(emitter, behaviour.StateEnable, typeof(StateEnableDTO));
 | 
			
		||||
 | 
			
		||||
        emitter.Emit(new MappingEnd());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								Engine.Serialization/DTOs/BehaviourDTO.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Engine.Serialization/DTOs/BehaviourDTO.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
namespace Engine.Serialization.DTOs;
 | 
			
		||||
 | 
			
		||||
internal record struct BehaviourDTO(
 | 
			
		||||
    string ClassName,
 | 
			
		||||
    int Priority,
 | 
			
		||||
    StateEnableDTO StateEnable
 | 
			
		||||
);
 | 
			
		||||
							
								
								
									
										11
									
								
								Engine.Serialization/DTOs/GameObjectDTO.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Engine.Serialization/DTOs/GameObjectDTO.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
namespace Engine.Serialization.DTOs;
 | 
			
		||||
 | 
			
		||||
internal record struct GameObjectDTO(
 | 
			
		||||
    string Id,
 | 
			
		||||
    string Name,
 | 
			
		||||
    TransformDTO Transform,
 | 
			
		||||
    List<BehaviourDTO> Behaviours,
 | 
			
		||||
    StateEnableDTO StateEnable
 | 
			
		||||
);
 | 
			
		||||
							
								
								
									
										6
									
								
								Engine.Serialization/DTOs/StateEnableDto.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Engine.Serialization/DTOs/StateEnableDto.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
namespace Engine.Serialization.DTOs;
 | 
			
		||||
 | 
			
		||||
internal record struct StateEnableDTO(
 | 
			
		||||
    string ClassName,
 | 
			
		||||
    bool Enabled
 | 
			
		||||
);
 | 
			
		||||
							
								
								
									
										10
									
								
								Engine.Serialization/DTOs/TransformDTO.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								Engine.Serialization/DTOs/TransformDTO.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
using Syntriax.Engine.Core;
 | 
			
		||||
 | 
			
		||||
namespace Engine.Serialization.DTOs;
 | 
			
		||||
 | 
			
		||||
internal record struct TransformDTO(
 | 
			
		||||
    string? ParentId,
 | 
			
		||||
    Vector2D Position,
 | 
			
		||||
    Vector2D Scale,
 | 
			
		||||
    float Rotation
 | 
			
		||||
);
 | 
			
		||||
							
								
								
									
										17
									
								
								Engine.Serialization/Engine.Serialization.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Engine.Serialization/Engine.Serialization.csproj
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
<Project Sdk="Microsoft.NET.Sdk">
 | 
			
		||||
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <TargetFramework>net8.0</TargetFramework>
 | 
			
		||||
    <ImplicitUsings>disable</ImplicitUsings>
 | 
			
		||||
    <Nullable>enable</Nullable>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="YamlDotNet" Version="15.1.1" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ProjectReference Include="..\Engine.Core\Engine.Core.csproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
</Project>
 | 
			
		||||
							
								
								
									
										70
									
								
								Engine.Serialization/GameObjectYamlConverter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								Engine.Serialization/GameObjectYamlConverter.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
 | 
			
		||||
using Engine.Serialization.DTOs;
 | 
			
		||||
 | 
			
		||||
using YamlDotNet.Core;
 | 
			
		||||
using YamlDotNet.Core.Events;
 | 
			
		||||
using YamlDotNet.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace Engine.Serialization;
 | 
			
		||||
 | 
			
		||||
internal class GameObjectYamlConverter : IYamlTypeConverter
 | 
			
		||||
{
 | 
			
		||||
    public bool Accepts(Type type) => type == typeof(GameObjectDTO);
 | 
			
		||||
 | 
			
		||||
    public object ReadYaml(IParser parser, Type type)
 | 
			
		||||
    {
 | 
			
		||||
        if (parser.Current is not MappingStart)
 | 
			
		||||
            throw new InvalidOperationException("Expected MappingStart");
 | 
			
		||||
 | 
			
		||||
        parser.MoveNext();
 | 
			
		||||
        var gameObject = new GameObjectDTO();
 | 
			
		||||
        while (parser.Current != null && parser.Current is not MappingEnd)
 | 
			
		||||
        {
 | 
			
		||||
            var propertyName = ((Scalar)parser.Current).Value;
 | 
			
		||||
            parser.MoveNext();
 | 
			
		||||
            switch (propertyName)
 | 
			
		||||
            {
 | 
			
		||||
                case nameof(GameObjectDTO.Id):
 | 
			
		||||
                    gameObject.Id = ((Scalar)parser.Current).Value;
 | 
			
		||||
                    break;
 | 
			
		||||
                case nameof(GameObjectDTO.Name):
 | 
			
		||||
                    gameObject.Name = ((Scalar)parser.Current).Value;
 | 
			
		||||
                    break;
 | 
			
		||||
                case nameof(GameObjectDTO.Transform):
 | 
			
		||||
                    gameObject.Transform = (TransformDTO)(new TransformYamlConverter().ReadYaml(parser, typeof(TransformDTO)) ?? new Exception());
 | 
			
		||||
                    break;
 | 
			
		||||
                // case nameof(GameObjectDTO.Behaviours):
 | 
			
		||||
                //     gameObject.Rotation = (List<BehaviourDTO>)(new BehaviourYamlConverter().ReadYaml(parser, typeof(BehaviourDTO)) ?? new Exception());
 | 
			
		||||
                //     break;
 | 
			
		||||
                case nameof(GameObjectDTO.StateEnable):
 | 
			
		||||
                    gameObject.StateEnable = (StateEnableDTO)(new StateEnableYamlConverter().ReadYaml(parser, typeof(StateEnableDTO)) ?? new Exception());
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
            parser.MoveNext();
 | 
			
		||||
        }
 | 
			
		||||
        return gameObject;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void WriteYaml(IEmitter emitter, object? value, Type type)
 | 
			
		||||
    {
 | 
			
		||||
        var gameObject = (GameObjectDTO)(value ?? throw new Exception());
 | 
			
		||||
 | 
			
		||||
        Vector2DYamlConverter vector2DYamlConverter = new();
 | 
			
		||||
        StateEnableYamlConverter stateEnableYamlConverter = new();
 | 
			
		||||
 | 
			
		||||
        emitter.Emit(new MappingStart());
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(GameObjectDTO.Id)));
 | 
			
		||||
        emitter.Emit(new Scalar(gameObject.Id.ToString()));
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(GameObjectDTO.Name)));
 | 
			
		||||
        emitter.Emit(new Scalar(gameObject.Name.ToString()));
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(GameObjectDTO.Transform)));
 | 
			
		||||
        vector2DYamlConverter.WriteYaml(emitter, gameObject.Transform, typeof(TransformDTO));
 | 
			
		||||
        // emitter.Emit(new Scalar(nameof(GameObjectDTO.Behaviours)));
 | 
			
		||||
        // vector2DYamlConverter.WriteYaml(emitter, gameObject.Behaviours, typeof(BehavioursDTO));
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(GameObjectDTO.StateEnable)));
 | 
			
		||||
        stateEnableYamlConverter.WriteYaml(emitter, gameObject.StateEnable, typeof(StateEnableDTO));
 | 
			
		||||
        emitter.Emit(new MappingEnd());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								Engine.Serialization/ISerializer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Engine.Serialization/ISerializer.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
namespace Engine.Serialization;
 | 
			
		||||
 | 
			
		||||
public interface ISerializer
 | 
			
		||||
{
 | 
			
		||||
    public string Serialize<T>(T @object);
 | 
			
		||||
    public T Deserialize<T>(string serializedString);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								Engine.Serialization/InternalExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Engine.Serialization/InternalExtensions.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Engine.Serialization.DTOs;
 | 
			
		||||
using Syntriax.Engine.Core.Abstract;
 | 
			
		||||
 | 
			
		||||
namespace Engine.Serialization;
 | 
			
		||||
 | 
			
		||||
internal static class InternalExtensions
 | 
			
		||||
{
 | 
			
		||||
    public static TransformDTO ToDTO(this ITransform transform)
 | 
			
		||||
        => new(transform.Parent?.GameObject.Id, transform.Position, transform.Scale, transform.Rotation);
 | 
			
		||||
 | 
			
		||||
    public static GameObjectDTO ToDTO(this IGameObject gameObject)
 | 
			
		||||
        => new(gameObject.Id, gameObject.Name, gameObject.Transform.ToDTO(), gameObject.BehaviourController.ToDTO(), gameObject.StateEnable.ToDTO());
 | 
			
		||||
 | 
			
		||||
    public static StateEnableDTO ToDTO(this IStateEnable stateEnable)
 | 
			
		||||
        => new(stateEnable.GetType().FullName ?? throw new System.Exception(), stateEnable.Enabled);
 | 
			
		||||
 | 
			
		||||
    public static List<BehaviourDTO> ToDTO(this IBehaviourController behaviourController)
 | 
			
		||||
    {
 | 
			
		||||
        List<BehaviourDTO> dtos = [];
 | 
			
		||||
        foreach (var behaviour in behaviourController)
 | 
			
		||||
            dtos.Add(new(behaviour.GetType().FullName ?? throw new System.Exception(), behaviour.Priority, behaviour.StateEnable.ToDTO()));
 | 
			
		||||
        return dtos;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										52
									
								
								Engine.Serialization/StateEnableYamlConverter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								Engine.Serialization/StateEnableYamlConverter.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
 | 
			
		||||
using Engine.Serialization.DTOs;
 | 
			
		||||
 | 
			
		||||
using YamlDotNet.Core;
 | 
			
		||||
using YamlDotNet.Core.Events;
 | 
			
		||||
using YamlDotNet.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace Engine.Serialization;
 | 
			
		||||
 | 
			
		||||
internal class StateEnableYamlConverter : IYamlTypeConverter
 | 
			
		||||
{
 | 
			
		||||
    public bool Accepts(Type type) => type == typeof(StateEnableDTO);
 | 
			
		||||
 | 
			
		||||
    public object ReadYaml(IParser parser, Type type)
 | 
			
		||||
    {
 | 
			
		||||
        if (parser.Current is not MappingStart)
 | 
			
		||||
            throw new InvalidOperationException("Expected MappingStart");
 | 
			
		||||
 | 
			
		||||
        parser.MoveNext();
 | 
			
		||||
        var stateEnable = new StateEnableDTO();
 | 
			
		||||
        while (parser.Current != null && parser.Current is not MappingEnd)
 | 
			
		||||
        {
 | 
			
		||||
            var propertyName = ((Scalar)parser.Current).Value;
 | 
			
		||||
            parser.MoveNext();
 | 
			
		||||
            switch (propertyName)
 | 
			
		||||
            {
 | 
			
		||||
                case nameof(StateEnableDTO.ClassName):
 | 
			
		||||
                    stateEnable.ClassName = ((Scalar)parser.Current).Value;
 | 
			
		||||
                    break;
 | 
			
		||||
                case nameof(StateEnableDTO.Enabled):
 | 
			
		||||
                    stateEnable.Enabled = bool.Parse(((Scalar)parser.Current).Value);
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
            parser.MoveNext();
 | 
			
		||||
        }
 | 
			
		||||
        return stateEnable;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void WriteYaml(IEmitter emitter, object? value, Type type)
 | 
			
		||||
    {
 | 
			
		||||
        var stateEnable = (StateEnableDTO)(value ?? throw new Exception());
 | 
			
		||||
 | 
			
		||||
        emitter.Emit(new MappingStart());
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(StateEnableDTO.ClassName)));
 | 
			
		||||
        emitter.Emit(new Scalar(stateEnable.ClassName));
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(StateEnableDTO.Enabled)));
 | 
			
		||||
        emitter.Emit(new Scalar(stateEnable.Enabled.ToString()));
 | 
			
		||||
        emitter.Emit(new MappingEnd());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								Engine.Serialization/TransformYamlConverter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								Engine.Serialization/TransformYamlConverter.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
 | 
			
		||||
using Engine.Serialization.DTOs;
 | 
			
		||||
 | 
			
		||||
using Syntriax.Engine.Core;
 | 
			
		||||
 | 
			
		||||
using YamlDotNet.Core;
 | 
			
		||||
using YamlDotNet.Core.Events;
 | 
			
		||||
using YamlDotNet.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace Engine.Serialization;
 | 
			
		||||
 | 
			
		||||
internal class TransformYamlConverter : IYamlTypeConverter
 | 
			
		||||
{
 | 
			
		||||
    public bool Accepts(Type type) => type == typeof(TransformDTO);
 | 
			
		||||
 | 
			
		||||
    public object ReadYaml(IParser parser, Type type)
 | 
			
		||||
    {
 | 
			
		||||
        if (parser.Current is not MappingStart)
 | 
			
		||||
            throw new InvalidOperationException("Expected MappingStart");
 | 
			
		||||
 | 
			
		||||
        parser.MoveNext();
 | 
			
		||||
        var transform = new TransformDTO();
 | 
			
		||||
        while (parser.Current != null && parser.Current is not MappingEnd)
 | 
			
		||||
        {
 | 
			
		||||
            var propertyName = ((Scalar)parser.Current).Value;
 | 
			
		||||
            parser.MoveNext();
 | 
			
		||||
            switch (propertyName)
 | 
			
		||||
            {
 | 
			
		||||
                case nameof(TransformDTO.ParentId):
 | 
			
		||||
                    transform.ParentId = new Vector2DYamlConverter().ReadYaml(parser, typeof(Vector2D))?.ToString();
 | 
			
		||||
                    break;
 | 
			
		||||
                case nameof(TransformDTO.Position):
 | 
			
		||||
                    transform.Position = (Vector2D)(new Vector2DYamlConverter().ReadYaml(parser, typeof(Vector2D)) ?? new Exception());
 | 
			
		||||
                    break;
 | 
			
		||||
                case nameof(TransformDTO.Scale):
 | 
			
		||||
                    transform.Scale = (Vector2D)(new Vector2DYamlConverter().ReadYaml(parser, typeof(Vector2D)) ?? new Exception());
 | 
			
		||||
                    break;
 | 
			
		||||
                case nameof(TransformDTO.Rotation):
 | 
			
		||||
                    transform.Rotation = float.Parse(((Scalar)parser.Current).Value);
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
            parser.MoveNext();
 | 
			
		||||
        }
 | 
			
		||||
        return transform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void WriteYaml(IEmitter emitter, object? value, Type type)
 | 
			
		||||
    {
 | 
			
		||||
        var transform = (TransformDTO)(value ?? throw new Exception());
 | 
			
		||||
 | 
			
		||||
        Vector2DYamlConverter vector2DYamlConverter = new();
 | 
			
		||||
 | 
			
		||||
        emitter.Emit(new MappingStart());
 | 
			
		||||
        if (transform.ParentId is not null)
 | 
			
		||||
        {
 | 
			
		||||
            emitter.Emit(new Scalar(nameof(TransformDTO.ParentId)));
 | 
			
		||||
            emitter.Emit(new Scalar(transform.ParentId));
 | 
			
		||||
        }
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(TransformDTO.Position)));
 | 
			
		||||
        vector2DYamlConverter.WriteYaml(emitter, transform.Position, typeof(Vector2D));
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(TransformDTO.Scale)));
 | 
			
		||||
        vector2DYamlConverter.WriteYaml(emitter, transform.Scale, typeof(Vector2D));
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(TransformDTO.Rotation)));
 | 
			
		||||
        emitter.Emit(new Scalar(transform.Rotation.ToString()));
 | 
			
		||||
        emitter.Emit(new MappingEnd());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										48
									
								
								Engine.Serialization/Vector2DYamlConverter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								Engine.Serialization/Vector2DYamlConverter.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
using System;
 | 
			
		||||
 | 
			
		||||
using Syntriax.Engine.Core;
 | 
			
		||||
 | 
			
		||||
using YamlDotNet.Core;
 | 
			
		||||
using YamlDotNet.Core.Events;
 | 
			
		||||
using YamlDotNet.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace Engine.Serialization;
 | 
			
		||||
 | 
			
		||||
internal class Vector2DYamlConverter : IYamlTypeConverter
 | 
			
		||||
{
 | 
			
		||||
    public bool Accepts(Type type) => type == typeof(Vector2D);
 | 
			
		||||
 | 
			
		||||
    public object? ReadYaml(IParser parser, Type type)
 | 
			
		||||
    {
 | 
			
		||||
        if (parser.Current is not MappingStart)
 | 
			
		||||
            throw new InvalidOperationException("Expected MappingStart");
 | 
			
		||||
 | 
			
		||||
        parser.MoveNext();
 | 
			
		||||
        float x = 0.0f;
 | 
			
		||||
        float y = 0.0f;
 | 
			
		||||
 | 
			
		||||
        while (parser.Current != null && parser.Current is not MappingEnd)
 | 
			
		||||
        {
 | 
			
		||||
            var propertyName = ((Scalar)parser.Current).Value;
 | 
			
		||||
            parser.MoveNext();
 | 
			
		||||
            switch (propertyName)
 | 
			
		||||
            {
 | 
			
		||||
                case nameof(Vector2D.X): x = float.Parse(((Scalar)parser.Current).Value); break;
 | 
			
		||||
                case nameof(Vector2D.Y): y = float.Parse(((Scalar)parser.Current).Value); break;
 | 
			
		||||
            }
 | 
			
		||||
            parser.MoveNext();
 | 
			
		||||
        }
 | 
			
		||||
        return new Vector2D(x, y);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void WriteYaml(IEmitter emitter, object? value, Type type)
 | 
			
		||||
    {
 | 
			
		||||
        var vector = (Vector2D)(value ?? throw new Exception());
 | 
			
		||||
        emitter.Emit(new MappingStart());
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(Vector2D.X)));
 | 
			
		||||
        emitter.Emit(new Scalar(vector.X.ToString()));
 | 
			
		||||
        emitter.Emit(new Scalar(nameof(Vector2D.Y)));
 | 
			
		||||
        emitter.Emit(new Scalar(vector.Y.ToString()));
 | 
			
		||||
        emitter.Emit(new MappingEnd());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								Engine.Serialization/YamlSerializer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								Engine.Serialization/YamlSerializer.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
using YamlDotNet.Serialization;
 | 
			
		||||
using YamlDotNet.Serialization.NamingConventions;
 | 
			
		||||
 | 
			
		||||
namespace Engine.Serialization;
 | 
			
		||||
 | 
			
		||||
public class YamlSerializer : ISerializer
 | 
			
		||||
{
 | 
			
		||||
    private readonly YamlDotNet.Serialization.ISerializer serializer = new SerializerBuilder()
 | 
			
		||||
        .WithNamingConvention(CamelCaseNamingConvention.Instance)
 | 
			
		||||
        .WithTypeConverter(new Vector2DYamlConverter())
 | 
			
		||||
        .WithTypeConverter(new TransformYamlConverter())
 | 
			
		||||
        .WithTypeConverter(new BehaviourYamlConverter())
 | 
			
		||||
        .WithTypeConverter(new GameObjectYamlConverter())
 | 
			
		||||
        .WithTypeConverter(new StateEnableYamlConverter())
 | 
			
		||||
        .Build();
 | 
			
		||||
    private readonly YamlDotNet.Serialization.IDeserializer deserializer = new DeserializerBuilder()
 | 
			
		||||
        .WithNamingConvention(UnderscoredNamingConvention.Instance)
 | 
			
		||||
        .WithTypeConverter(new Vector2DYamlConverter())
 | 
			
		||||
        .WithTypeConverter(new TransformYamlConverter())
 | 
			
		||||
        .WithTypeConverter(new BehaviourYamlConverter())
 | 
			
		||||
        .WithTypeConverter(new GameObjectYamlConverter())
 | 
			
		||||
        .WithTypeConverter(new StateEnableYamlConverter())
 | 
			
		||||
        .Build();
 | 
			
		||||
 | 
			
		||||
    public string Serialize<T>(T @object) => serializer.Serialize(@object);
 | 
			
		||||
    public T Deserialize<T>(string serializedString) => deserializer.Deserialize<T>(serializedString);
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user