libPersistence/EstadoPersistente.cs

71 lines
2.3 KiB
C#
Raw Permalink Normal View History

2024-06-22 14:10:51 -03:00
using System;
using System.IO;
using System.Reflection;
using System.Windows;
using Newtonsoft.Json;
namespace libPersistence
{
public abstract class EstadoPersistente<T> where T : EstadoPersistente<T>, new()
{
private static readonly Lazy<T> instance = new Lazy<T>(() => Load());
static EstadoPersistente()
{
Application.Current.Exit += OnApplicationExit;
}
public static T Instance => instance.Value;
private static string GetFileName()
{
var appName = AppDomain.CurrentDomain.FriendlyName;
var className = typeof(T).Name;
var folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), appName);
Directory.CreateDirectory(folderPath);
return Path.Combine(folderPath, $"{className}.json");
}
private static T Load()
{
var fileName = GetFileName();
if (File.Exists(fileName))
{
var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
ObjectCreationHandling = ObjectCreationHandling.Replace,
// PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
};
var jsonString = File.ReadAllText(fileName);
return JsonConvert.DeserializeObject<T>(jsonString) ?? new T();
}
return new T();
}
private static void OnApplicationExit(object sender, ExitEventArgs e)
{
Instance.Save();
}
public void Save()
{
var fileName = GetFileName();
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
// PreserveReferencesHandling = PreserveReferencesHandling.Objects,
NullValueHandling = NullValueHandling.Ignore,
TypeNameHandling = TypeNameHandling.Auto
};
// Serializar
var serializedData = JsonConvert.SerializeObject(this, settings);
File.WriteAllText(fileName, serializedData);
}
}
}