TechbloxModdingAPI/GamecraftModdingAPI/Persistence/SerializerManager.cs
NorbiPeti f403feb298 Update to Gamecraft 2020.06.17.08.41 (preview)
Removed BlockIdentifiers.OWNED_BLOCKS as the original got replaced with an array
Added the correct group for each supported functional block
Removed EntityFactory property from IEntitySerializer as it is provided on deserialization
2020-07-11 00:30:58 +02:00

74 lines
2.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Svelto.ECS;
using Svelto.ECS.Serialization;
using GamecraftModdingAPI.Utility;
namespace GamecraftModdingAPI.Persistence
{
/// <summary>
/// Keeps track of serializers.
/// This is used to add and retrieve serializers.
/// Added IEntitySerializations are used in serializing and deserializing Gamecraft save files (GameSave.GC).
/// </summary>
public static class SerializerManager
{
private static Dictionary<string, IEntitySerializer> _serializers = new Dictionary<string, IEntitySerializer>();
private static Dictionary<string, Action<IEntitySerialization>> _registrations = new Dictionary<string, Action<IEntitySerialization>>();
private static EnginesRoot _lastEnginesRoot;
public static void AddSerializer<T>(IEntitySerializer serializer) where T : ISerializableEntityDescriptor, new()
{
string name = typeof(T).FullName;
_serializers[name] = serializer;
_registrations[name] = (IEntitySerialization ies) => { ies.RegisterSerializationFactory<T>(serializer); };
if (_lastEnginesRoot != null)
{
_registrations[name].Invoke(_lastEnginesRoot.GenerateEntitySerializer());
_lastEnginesRoot.AddEngine(serializer);
}
}
public static bool ExistsSerializer(string name)
{
return _serializers.ContainsKey(name);
}
public static bool ExistsSerializer<T>(IEntitySerializer serializer) where T : ISerializableEntityDescriptor, new()
{
return ExistsSerializer(typeof(T).FullName);
}
public static IEntitySerializer GetSerializer(string name)
{
return _serializers[name];
}
public static string[] GetSerializerNames()
{
return _serializers.Keys.ToArray();
}
public static int GetSerializersCount()
{
return _serializers.Count;
}
public static void RegisterSerializers(EnginesRoot enginesRoot)
{
_lastEnginesRoot = enginesRoot;
IEntitySerialization ies = enginesRoot.GenerateEntitySerializer();
foreach (string key in _serializers.Keys)
{
Logging.MetaDebugLog($"Registering IEntitySerializer for {key}");
_registrations[key].Invoke(ies);
enginesRoot.AddEngine(_serializers[key]);
}
}
}
}