-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRuntimeUnityObjectConverter.cs
92 lines (78 loc) · 2.76 KB
/
RuntimeUnityObjectConverter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System;
using System.Reflection;
using Newtonsoft.Json;
using UnityEngine;
using Object = UnityEngine.Object;
namespace QuickEye.ImportableAssets
{
internal class RuntimeUnityObjectConverter : JsonConverter<Object>
{
private const string InstanceIdKey = "instanceID";
private static readonly MethodInfo FindObjectFromInstanceIDMethodInfo = GetFindObjectFromInstanceID();
private bool _skipOverMe;
public override bool CanWrite
{
get
{
if (_skipOverMe)
{
_skipOverMe = false;
return false;
}
return true;
}
}
public override Object ReadJson(JsonReader reader, Type objectType, Object existingValue, bool hasExistingValue,
Newtonsoft.Json.JsonSerializer serializer)
{
if (reader.Path == "")
return null;
if (reader.TokenType != JsonToken.StartObject)
return null;
Object result = null;
while (reader.Read())
{
if (reader.TokenType == JsonToken.EndObject)
break;
if (reader.TokenType == JsonToken.PropertyName)
{
var name = reader.Value?.ToString();
reader.Read();
var instanceId = reader.Value;
if (name is "instanceID" && instanceId != null && reader.TokenType == JsonToken.Integer)
{
result = FindObjectFromInstanceID(Convert.ToInt32(instanceId));
}
}
}
return result;
}
public override void WriteJson(JsonWriter writer, Object value, Newtonsoft.Json.JsonSerializer serializer)
{
if (writer.Path != "")
{
writer.WriteStartObject();
writer.WritePropertyName(InstanceIdKey);
writer.WriteValue(value.GetInstanceID());
writer.WriteEndObject();
}
else
{
_skipOverMe = true;
serializer.Serialize(writer, value);
}
}
private static Object FindObjectFromInstanceID(int instanceId)
{
if (FindObjectFromInstanceIDMethodInfo == null)
return null;
return (Object)FindObjectFromInstanceIDMethodInfo.Invoke(null, new object[] { instanceId });
}
private static MethodInfo GetFindObjectFromInstanceID()
{
return typeof(Object)
.GetMethod("FindObjectFromInstanceID",
BindingFlags.NonPublic | BindingFlags.Static);
}
}
}