71 lines
2.3 KiB
C#
71 lines
2.3 KiB
C#
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);
|
|
}
|
|
}
|
|
|
|
|
|
}
|