Tanoda
pb_ContractResolver.cs
Go to the documentation of this file.
1#undef PB_DEBUG
2
3using UnityEngine;
4using Newtonsoft.Json;
5using Newtonsoft.Json.Serialization;
6using Newtonsoft.Json.Linq;
7using System.Reflection;
8using System;
9using System.Linq;
10using System.Collections;
11using System.Collections.Generic;
12using GILES;
13
14namespace GILES.Serialization
15{
19 public class pb_ContractResolver : DefaultContractResolver
20 {
21 protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
22 {
23 JsonProperty property = base.CreateProperty(member, memberSerialization);
24
25 property.ShouldSerialize = instance =>
26 {
27#if !PB_DEBUG
28 try
29 {
30#endif
31 if( pb_Reflection.HasIgnoredAttribute(member) )
32 return false;
33
34 if(member is PropertyInfo)
35 {
36 PropertyInfo prop = (PropertyInfo) member;
37
38 if (prop.CanRead && prop.CanWrite && !prop.IsSpecialName)
39 {
40 prop.GetValue(instance, null);
41 return true;
42 }
43 }
44 else if(member is FieldInfo)
45 {
46 return true;
47 }
48#if !PB_DEBUG
49 }
50 catch (System.Exception e) {
51 Debug.LogWarning("Can't create field \"" + member.Name + "\" " + member.DeclaringType + " -> " + member.ReflectedType + "\n\n" + e.ToString());
52 }
53#endif
54
55 return false;
56 };
57
58 return property;
59 }
60
64 protected override JsonConverter ResolveContractConverter(Type type)
65 {
66 if( typeof(UnityEngine.Color).IsAssignableFrom(type) || typeof(UnityEngine.Color32).IsAssignableFrom(type) )
67 return GetConverter<pb_ColorConverter>();
68
69 if( typeof(UnityEngine.Matrix4x4).IsAssignableFrom(type) )
70 return GetConverter<pb_MatrixConverter>();
71
72 if( typeof(UnityEngine.Vector2).IsAssignableFrom(type) ||
73 typeof(UnityEngine.Vector3).IsAssignableFrom(type) ||
74 typeof(UnityEngine.Vector4).IsAssignableFrom(type) ||
75 typeof(UnityEngine.Quaternion).IsAssignableFrom(type) )
76 return GetConverter<pb_VectorConverter>();
77
78 if( typeof(UnityEngine.Mesh).IsAssignableFrom(type))
79 return GetConverter<pb_MeshConverter>();
80
81 if( typeof(UnityEngine.Material).IsAssignableFrom(type))
82 return GetConverter<pb_MaterialConverter>();
83
84 return base.ResolveContractConverter(type);
85 }
86
87 static Dictionary<Type, JsonConverter> converters = new Dictionary<Type, JsonConverter>();
88
89 private static T GetConverter<T>() where T : JsonConverter, new()
90 {
91 JsonConverter conv;
92
93 if(converters.TryGetValue(typeof(T), out conv))
94 return (T) conv;
95
96 conv = new T();
97
98 converters.Add(typeof(T), conv);
99
100 return (T) conv;
101 }
102 }
103}
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
override JsonConverter ResolveContractConverter(Type type)