using System; using System.IO; using System.Reflection; using System.Windows; using Newtonsoft.Json; namespace libPersistence { public abstract class EstadoPersistente where T : EstadoPersistente, new() { private static readonly Lazy instance = new Lazy(() => 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(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); } } }