private void fillobject(object obj, FieldNode fn) { foreach (System.Reflection.FieldInfo fi in obj.GetType().GetFields()) { object val = fn.getObject(fi.Name); fi.SetValue(obj, val); } fn.value = obj; }
private void postProcessObjectNode(FieldNode fieldNode) { // convert byte buffers to string instances in "string" fields for convenience if (fieldNode.typenode == null || fieldNode.typenode.type == null) { return; } if (fieldNode.typenode.type == "string") { // strings use "char" arrays, so it should be wrapped in a ByteBuffer //ByteBuffer buf = fieldNode.getArrayData<ByteBuffer>(); object arrayobj = fieldNode.getArrayData(); if (arrayobj != null && arrayobj is ByteBuffer) { ByteBuffer buf = (ByteBuffer)arrayobj; char[] carray = new char[buf.data.Length]; for (int i = 0; i < carray.Length; i++) { carray[i] = (char)buf.data[i]; } fieldNode.value = new String(carray);//, "UTF-8" fieldNode.cleanChilds(); } } else if (fieldNode.typenode.isArray) { int size = fieldNode.getSInt32("size"); fieldNode.value = fieldNode.getObject("data"); } else if (fieldNode.typenode.type.StartsWith("PPtr<") && fieldNode.typenode.type.EndsWith(">")) { object obj = new PPtrObject(); fillobject(obj, fieldNode); fieldNode.cleanChilds(); } else if (fieldNode.typenode.type == "Quaternionf" || fieldNode.typenode.type == "Vector3f" || fieldNode.typenode.type == "PackedBitVector" || fieldNode.typenode.type == "VertexData" || fieldNode.typenode.type == "UnityPropertySheet" || fieldNode.typenode.type == "AssetInfo" || fieldNode.typenode.type == "ResourceManager_Dependency") { System.Type t = System.Type.GetType("AssetEx." + fieldNode.typenode.type, false, false); System.Reflection.ConstructorInfo ci = t.GetConstructor(new Type[] { }); object v = ci.Invoke(new object[] { }); fillobject(v, fieldNode); fieldNode.cleanChilds(); } else if (fieldNode.typenode.type == "map") { List <FieldNode> childnodes = (List <FieldNode>)fieldNode.getArrayData(); Dictionary <object, object> map = new Dictionary <object, object>(); foreach (FieldNode fn in childnodes) { object first = fn.getObject("first"); object second = fn.getObject("second"); if (first != null && second != null) { map[first] = second; } } fieldNode.value = map; fieldNode.cleanChilds(); } else if (fieldNode.typenode.type == "vector") { object obj = fieldNode.getArrayData(); if (obj is List <FieldNode> ) { List <FieldNode> childnodes = (List <FieldNode>)obj; List <object> vectorl = new List <object>(); foreach (FieldNode fn in childnodes) { if (fn.value != null) { vectorl.Add(fn.value); } else { vectorl.Add(fn); } } fieldNode.value = vectorl; fieldNode.cleanChilds(); } else { fieldNode.value = obj; fieldNode.cleanChilds(); } } else if (fieldNode.getChilds() != null && fieldNode.getChilds().Count == 1) { fieldNode.value = fieldNode.getArrayData(); if (fieldNode.value != null) { fieldNode.cleanChilds(); } } }