From 894cae0c52957f09ec92cee5345284c28066c7fc Mon Sep 17 00:00:00 2001 From: goyuken Date: Tue, 19 May 2015 23:27:28 +0000 Subject: [PATCH] apple 2 savestates: custom Type handling to be more resilient to assembly changes --- ExternalCoreProjects/Virtu/ExtraConverters.cs | 79 ++++++++++++++++++ ExternalCoreProjects/Virtu/Machine.cs | 9 ++ References/Virtu.dll | Bin 146432 -> 147968 bytes 3 files changed, 88 insertions(+) diff --git a/ExternalCoreProjects/Virtu/ExtraConverters.cs b/ExternalCoreProjects/Virtu/ExtraConverters.cs index 743fe4bef9..389b6148d3 100644 --- a/ExternalCoreProjects/Virtu/ExtraConverters.cs +++ b/ExternalCoreProjects/Virtu/ExtraConverters.cs @@ -156,6 +156,85 @@ namespace Jellyfish.Virtu } } + public class TypeTypeConverter : JsonConverter + { + // serialize and deserialize types, ignoring assembly entirely and only using namespace+typename + // all types, including generic type arguments to supplied types, must be in one of the declared assemblies (only checked on read!) + // the main goal here is to have something with a slight chance of working across versions + + public TypeTypeConverter(IEnumerable ass) + { + assemblies = ass.ToList(); + } + + private List assemblies; + private Dictionary readlookup = new Dictionary(); + + public override bool CanConvert(Type objectType) + { + return typeof(Type).IsAssignableFrom(objectType); + } + + public override bool CanRead { get { return true; } } + public override bool CanWrite { get { return true; } } + + private Type GetType(string name) + { + Type ret; + if (!readlookup.TryGetValue(name, out ret)) + { + ret = assemblies.Select(ass => ass.GetType(name, false)).Where(t => t != null).Single(); + readlookup.Add(name, ret); + } + return ret; + } + + private static string GetName(Type type) + { + return string.Format("{0}.{1}", type.Namespace, type.Name); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + else if (reader.TokenType == JsonToken.String) + { + return GetType(reader.Value.ToString()); + } + else if (reader.TokenType == JsonToken.StartArray) // full generic + { + List vals = serializer.Deserialize>(reader); + return GetType(vals[0]).MakeGenericType(vals.Skip(1).Select(GetType).ToArray()); + } + else + { + throw new InvalidOperationException(); + } + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + var type = (Type)value; + if (type.IsGenericType && !type.IsGenericTypeDefinition) + { + writer.WriteStartArray(); + writer.WriteValue(GetName(type)); + foreach (var t in type.GetGenericArguments()) + { + writer.WriteValue(GetName(t)); + } + writer.WriteEndArray(); + } + else + { + writer.WriteValue(GetName(type)); + } + } + } + public class DelegateConverter : JsonConverter { // caveats: if used on anonymous delegates and/or closures, brittle to name changes in the generated classes and methods diff --git a/ExternalCoreProjects/Virtu/Machine.cs b/ExternalCoreProjects/Virtu/Machine.cs index 958932c5af..47bf00bc15 100644 --- a/ExternalCoreProjects/Virtu/Machine.cs +++ b/ExternalCoreProjects/Virtu/Machine.cs @@ -123,6 +123,8 @@ namespace Jellyfish.Virtu private static JsonSerializer CreateSerializer() { + // TODO: converters could be cached for speedup + var ser = new JsonSerializer { TypeNameHandling = TypeNameHandling.Auto, @@ -130,8 +132,15 @@ namespace Jellyfish.Virtu ReferenceLoopHandling = ReferenceLoopHandling.Serialize, }; + ser.Converters.Add(new TypeTypeConverter(new[] + { + // all expected Types to convert are either in this assembly or mscorlib + typeof(Machine).Assembly, + typeof(object).Assembly + })); ser.Converters.Add(new DelegateConverter()); ser.Converters.Add(new ArrayConverter()); + var cr = new DefaultContractResolver(); cr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic; ser.ContractResolver = cr; diff --git a/References/Virtu.dll b/References/Virtu.dll index 5d6306ceaa94ab12c62deaa1367a13c5a06f454b..8777c9db5e9de1e28cfc6e13137213284318f7d2 100644 GIT binary patch delta 30895 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 delta 29455 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 PziaZ1xGkYS-xmK5DcfeC