OverviewFilesCommitsIssuesDocsReleasesPeers

ifsrenderer-linux / IFSEngine / Serialization / IfsSerializer.cs

81 lines · csharp ref:
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

using IFSEngine.Model;

using Newtonsoft.Json;

namespace IFSEngine.Serialization;

public static class IfsSerializer
{
    private static readonly IteratorConverter _iteratorConverter = new();
    private static readonly IfsConverter _ifsConverter = new();

    public static IFS LoadJsonFile(string path, IEnumerable<TransformPlugin> transforms, IEnumerable<EffectPlugin> postfxs, bool ignorePluginVersions)
    {
        string fileContent = File.ReadAllText(path, Encoding.UTF8);
        return DeserializeJsonString(fileContent, transforms, postfxs, ignorePluginVersions);
    }

    public static void SaveJsonFile(IFS ifs, string path)
    {
        string fileContent = SerializeJsonString(ifs);
        File.WriteAllText(path, fileContent, Encoding.UTF8);
    }

    public static async Task<IFS> LoadJsonFileAsync(string path, IEnumerable<TransformPlugin> transforms, IEnumerable<EffectPlugin> postfxs, bool ignorePluginVersions)
    {
        string fileContent = await File.ReadAllTextAsync(path, Encoding.UTF8);
        return DeserializeJsonString(fileContent, transforms, postfxs, ignorePluginVersions);
    }

    public static async Task SaveJsonFileAsync(IFS ifs, string path)
    {
        string fileContent = SerializeJsonString(ifs);
        await File.WriteAllTextAsync(path, fileContent, Encoding.UTF8);
    }

    public static IFS DeserializeJsonString(string ifsState, IEnumerable<TransformPlugin> transforms, IEnumerable<EffectPlugin> postfxs, bool ignorePluginVersions)
    {
        JsonSerializerSettings settings = GetJsonSerializerSettings(transforms, postfxs, ignorePluginVersions);
        try
        {
            IFS result = JsonConvert.DeserializeObject<IFS>(ifsState, settings);
            return result;
        }
        catch (Exception ex)
        {//Custom JsonConverters may throw different Exceptions
            throw new SerializationException("Serialization Exception", ex);
        }
    }

    public static string SerializeJsonString(IFS ifs)
    {
        JsonSerializerSettings settings = GetJsonSerializerSettings(null, null, false);
        return JsonConvert.SerializeObject(ifs, settings);
    }

    internal static JsonSerializerSettings GetJsonSerializerSettings(IEnumerable<TransformPlugin> transforms, IEnumerable<EffectPlugin> postfxs, bool ignoreVersion)
    {
        return new JsonSerializerSettings
        {
            Converters =
                [
                    new TransformConverter(transforms, ignoreVersion),
                    new EffectLayerConverter(postfxs, ignoreVersion),
                    _iteratorConverter,
                    _ifsConverter
                ],
            ObjectCreationHandling = ObjectCreationHandling.Replace//replace default palette
                                                                   //TypeNameHandling = TypeNameHandling.Auto
        };
    }


}