using System; using System.Collections.Generic; using Engine.Serialization.DTOs; using Syntriax.Engine.Core; using Syntriax.Engine.Core.Abstract; using Syntriax.Engine.Core.Factory; namespace Engine.Serialization; public static class Serialization { private static readonly ISerializer defaultSerializer = new YamlSerializer(); public static string SerializeGameObject(IGameObject gameObject) => Serialize(gameObject.ToDTO(), defaultSerializer); public static T DeserializeGameObject(string serializedString) where T : class, IGameObject { GameObjectDTO gameObjectDTO = Deserialize(serializedString, defaultSerializer); return CreateGameObject(gameObjectDTO); } private static T CreateGameObject(GameObjectDTO gameObjectDTO) where T : class, IGameObject { Type gameObjectType = (gameObjectDTO.ClassType is not null) ? TypeFactory.Get(gameObjectDTO.ClassType) : typeof(GameObject); Type stateEnableType = (gameObjectDTO.StateEnable.ClassType is not null) ? TypeFactory.Get(gameObjectDTO.StateEnable.ClassType) : typeof(Transform); Type transformType = (gameObjectDTO.Transform.ClassType is not null) ? TypeFactory.Get(gameObjectDTO.Transform.ClassType) : typeof(Transform); Type behaviourControllerType = (gameObjectDTO.BehaviourController.ClassType is not null) ? TypeFactory.Get(gameObjectDTO.BehaviourController.ClassType) : typeof(Transform); ITransform transform = TypeFactory.Get(transformType); IStateEnable stateEnable = TypeFactory.Get(stateEnableType); IBehaviourController behaviourController = TypeFactory.Get(behaviourControllerType); T t = new GameObjectFactory().Instantiate(transform, behaviourController, stateEnable, gameObjectType); foreach (var behaviourDto in gameObjectDTO.BehaviourController.Behaviours) { IBehaviour behaviour = TypeFactory.Get(behaviourDto.ClassType); behaviourController.AddBehaviour(behaviour); } return t; } public static string SerializeGameManager(IGameManager gameManager) => Serialize(gameManager.ToDTO(), defaultSerializer); public static T DeserializeGameManager(string serializedString) where T : class, IGameManager { GameManagerDTO gameManagerDto = Deserialize(serializedString, defaultSerializer); Type gameManagerType = (gameManagerDto.ClassType is not null) ? TypeFactory.Get(gameManagerDto.ClassType) : typeof(GameManager); T gameManager = TypeFactory.Get(gameManagerType); foreach (var gameObjectDto in gameManagerDto.GameObjects) gameManager.RegisterGameObject(CreateGameObject(gameObjectDto)); return gameManager; } public static string Serialize(T @object) => Serialize(@object, defaultSerializer); public static string Serialize(T @object, ISerializer serializer) => serializer.Serialize(@object); public static T Deserialize(string serializedString) => Deserialize(serializedString, defaultSerializer); public static T Deserialize(string serializedString, ISerializer serializer) => serializer.Deserialize(serializedString); }