예제 #1
0
    //---------------------------------------------------------------------------------
    //  DeserializeObject
    //---------------------------------------------------------------------------------
    private static object DeserializeObject(XMLInStream stream, Type type)
    {
        object data = Activator.CreateInstance(type);

        System.Reflection.FieldInfo[] fieldInfo = type.GetFields();
        foreach (System.Reflection.FieldInfo info in fieldInfo)
        {
            switch (info.FieldType.ToString())
            {
            case "System.String":
                string resS;
                if (stream.Has(info.Name))
                {
                    stream.Content(info.Name, out resS);
                    info.SetValue(data, resS);
                }
                break;

            case "System.Single":
                float resF;
                if (stream.Has(info.Name))
                {
                    stream.Content(info.Name, out resF);
                    info.SetValue(data, resF);
                }
                break;

            case "System.Int32":
                int resI;
                if (stream.Has(info.Name))
                {
                    stream.Content(info.Name, out resI);
                    info.SetValue(data, resI);
                }
                break;

            case "System.Boolean":
                bool resB;
                if (stream.Has(info.Name))
                {
                    stream.Content(info.Name, out resB);
                    info.SetValue(data, resB);
                }
                break;

            case "UnityEngine.Vector3":
                Vector3 resV;
                if (stream.Has(info.Name))
                {
                    stream.Content(info.Name, out resV);
                    info.SetValue(data, resV);
                }
                break;

            case "UnityEngine.Quaternion":
                Quaternion resQ;
                if (stream.Has(info.Name))
                {
                    stream.Content(info.Name, out resQ);
                    info.SetValue(data, resQ);
                }
                break;

            case "UnityEngine.Color":
                Color resC;
                if (stream.Has(info.Name))
                {
                    stream.Content(info.Name, out resC);
                    info.SetValue(data, resC);
                }
                break;

            case "UnityEngine.Rect":
                Rect resR;
                if (stream.Has(info.Name))
                {
                    stream.Content(info.Name, out resR);
                    info.SetValue(data, resR);
                }
                break;

            case "UnityEngine.Vector2":
                Vector2 resV2;
                if (stream.Has(info.Name))
                {
                    stream.Content(info.Name, out resV2);
                    info.SetValue(data, resV2);
                }
                break;

            default:
                if (stream.Has(info.Name))
                {
                    if (info.FieldType.IsEnum) // Enum
                    {
                        string e;
                        stream.Content(info.Name, out e);
                        info.SetValue(data, Enum.Parse(info.FieldType, e));
                    }
                    else if (info.FieldType.IsGenericType) // can only be a List
                    {
                        Type       containedType = info.FieldType.GetGenericArguments()[0];
                        Type       typeList      = typeof(List <>);
                        Type       actualType    = typeList.MakeGenericType(containedType);
                        MethodInfo addMethod     = actualType.GetMethod("Add");
                        object     list          = Activator.CreateInstance(actualType);
                        stream.Start(info.Name).List("item", delegate(XMLInStream stream2){
                            object o = DeserializeListElement(stream2, containedType);
                            addMethod.Invoke(list, new object[] { o });
                        }).End();
                        info.SetValue(data, list);
                    }
                    else if (info.FieldType.IsArray) // Array
                    {
                        Type       containedType = info.FieldType.GetElementType();
                        Type       typeList      = typeof(List <>);
                        Type       actualType    = typeList.MakeGenericType(containedType);
                        MethodInfo addMethod     = actualType.GetMethod("Add");
                        MethodInfo toArrayMethod = actualType.GetMethod("ToArray");
                        object     list          = Activator.CreateInstance(actualType);
                        stream.Start(info.Name).List("item", delegate(XMLInStream stream2){
                            object o = DeserializeListElement(stream2, containedType);
                            addMethod.Invoke(list, new object[] { o });
                        }).End();
                        object array = toArrayMethod.Invoke(list, new object[] {});
                        info.SetValue(data, array);
                    }
                    else // Embedded Object
                    {
                        stream.Start(info.Name);
                        object created = DeserializeObject(stream, info.FieldType);
                        stream.End();
                        info.SetValue(data, created);
                    }
                }
                break;
            }
        }
        return(data);
    }
    private static object DeserializeObject(XMLInStream stream, Type type)
    {
        //IL_01ec: Unknown result type (might be due to invalid IL or missing references)
        //IL_021f: Unknown result type (might be due to invalid IL or missing references)
        //IL_0252: Unknown result type (might be due to invalid IL or missing references)
        //IL_0285: Unknown result type (might be due to invalid IL or missing references)
        //IL_02b8: Unknown result type (might be due to invalid IL or missing references)
        object obj = Activator.CreateInstance(type);

        FieldInfo[] fields = type.GetFields();
        FieldInfo[] array  = fields;
        Type        containedType;
        MethodInfo  addMethod;
        object      list;
        Type        containedType2;
        MethodInfo  addMethod2;
        object      list2;

        foreach (FieldInfo fieldInfo in array)
        {
            switch (fieldInfo.FieldType.ToString())
            {
            case "System.String":
                if (stream.Has(fieldInfo.Name))
                {
                    stream.Content(fieldInfo.Name, out string value12);
                    fieldInfo.SetValue(obj, value12);
                }
                break;

            case "System.Single":
                if (stream.Has(fieldInfo.Name))
                {
                    stream.Content(fieldInfo.Name, out float value7);
                    fieldInfo.SetValue(obj, value7);
                }
                break;

            case "System.Int32":
                if (stream.Has(fieldInfo.Name))
                {
                    stream.Content(fieldInfo.Name, out int value9);
                    fieldInfo.SetValue(obj, value9);
                }
                break;

            case "System.Boolean":
                if (stream.Has(fieldInfo.Name))
                {
                    stream.Content(fieldInfo.Name, out bool value5);
                    fieldInfo.SetValue(obj, value5);
                }
                break;

            case "UnityEngine.Vector3":
                if (stream.Has(fieldInfo.Name))
                {
                    stream.Content(fieldInfo.Name, out Vector3 value10);
                    fieldInfo.SetValue(obj, value10);
                }
                break;

            case "UnityEngine.Quaternion":
                if (stream.Has(fieldInfo.Name))
                {
                    stream.Content(fieldInfo.Name, out Quaternion value8);
                    fieldInfo.SetValue(obj, value8);
                }
                break;

            case "UnityEngine.Color":
                if (stream.Has(fieldInfo.Name))
                {
                    stream.Content(fieldInfo.Name, out Color value6);
                    fieldInfo.SetValue(obj, value6);
                }
                break;

            case "UnityEngine.Rect":
                if (stream.Has(fieldInfo.Name))
                {
                    stream.Content(fieldInfo.Name, out Rect value4);
                    fieldInfo.SetValue(obj, value4);
                }
                break;

            case "UnityEngine.Vector2":
                if (stream.Has(fieldInfo.Name))
                {
                    stream.Content(fieldInfo.Name, out Vector2 value11);
                    fieldInfo.SetValue(obj, value11);
                }
                break;

            default:
                if (stream.Has(fieldInfo.Name))
                {
                    if (fieldInfo.FieldType.IsEnum)
                    {
                        stream.Content(fieldInfo.Name, out string value);
                        fieldInfo.SetValue(obj, Enum.Parse(fieldInfo.FieldType, value));
                    }
                    else if (fieldInfo.FieldType.IsGenericType)
                    {
                        containedType = fieldInfo.FieldType.GetGenericArguments()[0];
                        Type typeFromHandle = typeof(List <>);
                        Type type2          = typeFromHandle.MakeGenericType(containedType);
                        addMethod = type2.GetMethod("Add");
                        list      = Activator.CreateInstance(type2);
                        stream.Start(fieldInfo.Name).List("item", delegate(XMLInStream stream2)
                        {
                            object obj3 = DeserializeListElement(stream2, containedType);
                            addMethod.Invoke(list, new object[1]
                            {
                                obj3
                            });
                        }).End();
                        fieldInfo.SetValue(obj, list);
                    }
                    else if (fieldInfo.FieldType.IsArray)
                    {
                        containedType2 = fieldInfo.FieldType.GetElementType();
                        Type typeFromHandle2 = typeof(List <>);
                        Type type3           = typeFromHandle2.MakeGenericType(containedType2);
                        addMethod2 = type3.GetMethod("Add");
                        MethodInfo method = type3.GetMethod("ToArray");
                        list2 = Activator.CreateInstance(type3);
                        stream.Start(fieldInfo.Name).List("item", delegate(XMLInStream stream2)
                        {
                            object obj2 = DeserializeListElement(stream2, containedType2);
                            addMethod2.Invoke(list2, new object[1]
                            {
                                obj2
                            });
                        }).End();
                        object value2 = method.Invoke(list2, new object[0]);
                        fieldInfo.SetValue(obj, value2);
                    }
                    else
                    {
                        stream.Start(fieldInfo.Name);
                        object value3 = DeserializeObject(stream, fieldInfo.FieldType);
                        stream.End();
                        fieldInfo.SetValue(obj, value3);
                    }
                }
                break;
            }
        }
        return(obj);
    }