BizHawk/BizHawk.Client.Common/config/ConfigService.cs

112 lines
2.7 KiB
C#

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
},
};
}
/// <exception cref="InvalidOperationException">internal error</exception>
public static T Load<T>(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);
}
if (config == null)
{
return new T();
}
return config;
}
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 (TextReader tr = new StringReader(serialized))
using (JsonTextReader jr = new JsonTextReader(tr))
{
TypeNameEncapsulator 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 (StringWriter sw = new StringWriter())
using (JsonTextWriter jw = new JsonTextWriter(sw) { Formatting = Formatting.None })
{
TypeNameEncapsulator tne = new TypeNameEncapsulator { o = o };
Serializer.Serialize(jw, tne, typeof(TypeNameEncapsulator));
sw.Flush();
return sw.ToString();
}
}
}
}