using System; using System.IO; using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; #pragma warning disable 618 namespace BizHawk.Client.Common { public static class ConfigService { private static readonly JsonSerializer Serializer; static ConfigService() { Serializer = new JsonSerializer { MissingMemberHandling = MissingMemberHandling.Ignore, TypeNameHandling = TypeNameHandling.Auto, ConstructorHandling = ConstructorHandling.Default, // because of the peculiar setup of Binding.cs and PathEntry.cs ObjectCreationHandling = ObjectCreationHandling.Replace, ContractResolver = new DefaultContractResolver { DefaultMembersSearchFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic }, }; } /// internal error public static T Load(string filepath) where T : new() { T config = default(T); try { var file = new FileInfo(filepath); if (file.Exists) { using var reader = file.OpenText(); var r = new JsonTextReader(reader); config = (T)Serializer.Deserialize(r, typeof(T)); } } catch (Exception ex) { throw new InvalidOperationException("Config Error", ex); } return config ?? new T(); } public static void Save(string filepath, object config) { var file = new FileInfo(filepath); try { using var writer = file.CreateText(); var w = new JsonTextWriter(writer) { Formatting = Formatting.Indented }; Serializer.Serialize(w, config); } catch { /* Eat it */ } } // movie 1.0 header stuff private class TypeNameEncapsulator { public object o; } public static object LoadWithType(string serialized) { using var tr = new StringReader(serialized); using var jr = new JsonTextReader(tr); var tne = (TypeNameEncapsulator)Serializer.Deserialize(jr, typeof(TypeNameEncapsulator)); // in the case of trying to deserialize nothing, tne will be nothing // we want to return nothing return tne?.o; } public static string SaveWithType(object o) { using var sw = new StringWriter(); using var jw = new JsonTextWriter(sw) { Formatting = Formatting.None }; var tne = new TypeNameEncapsulator { o = o }; Serializer.Serialize(jw, tne, typeof(TypeNameEncapsulator)); sw.Flush(); return sw.ToString(); } } }