summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/VRM/VRM/UniGLTF/Editor/Serialization/ObjectSerialization.cs
blob: 6f9d20da846a97699b65452d3e6c2dd8836b3eed (plain)
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);
                }
            }
        }
    }
}