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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
using System;
using System.IO;
using System.Linq;
using System.Text;
namespace UniGLTF
{
public abstract class FunctionSerializationBase : IValueSerialization
{
public Type ValueType
{
get;
protected set;
}
public bool IsInline
{
get { return false; }
}
public abstract void GenerateDeserializer(StreamWriter writer, string callName);
public string GenerateDeserializerCall(string callName, string argName)
{
return string.Format("{0}({1})", callName, argName);
}
}
public class ObjectSerialization : FunctionSerializationBase
{
string m_path;
FieldSerializationInfo[] m_fsi;
public ObjectSerialization(Type t, string path)
{
ValueType = t;
m_path = path;
m_fsi = t.GetFields(DeserializerGenerator.FIELD_FLAGS)
.Where(x =>
{
if (x.FieldType == typeof(object))
{
// object. coannot serialize
return false;
}
if (x.IsLiteral && !x.IsInitOnly)
{
// const
return false;
}
return true;
})
.Select(x =>
{
return new FieldSerializationInfo(x, path);
}).ToArray();
}
public override string ToString()
{
var sb = new StringBuilder();
foreach (var x in m_fsi)
{
sb.Append(x.ToString());
}
return sb.ToString();
}
public override void GenerateDeserializer(StreamWriter writer, string parentName)
{
writer.Write(@"
public static $0 $2(ListTreeNode<JsonValue> parsed)
{
var value = new $0();
foreach(var kv in parsed.ObjectItems())
{
var key = kv.Key.GetString();
"
.Replace("$0", ValueType.Name)
.Replace("$2", parentName)
);
foreach (var f in m_fsi)
{
writer.Write(@"
if(key==""$0""){
value.$0 = $1;
continue;
}
"
.Replace("$0", f.Name)
.Replace("$1", f.Serialization.GenerateDeserializerCall(f.FunctionName, "kv.Value"))
);
}
writer.Write(@"
}
return value;
}
");
foreach (var f in m_fsi)
{
if (!f.Serialization.IsInline)
{
f.Serialization.GenerateDeserializer(writer, f.FunctionName);
}
}
}
}
}
|