예제 #1
0
        public override void OnBeforeSerialize()
        {
            array = null;
            if (((typeCode & SerializableTypeCode.Array) == SerializableTypeCode.Array) || ((typeCode & SerializableTypeCode.List) == SerializableTypeCode.List))
            {
                if (value != null)
                {
                    if ((typeCode & SerializableTypeCode.Array) == SerializableTypeCode.Array)
                    {
                        SerializableTypeCode elemType = typeCode & (~SerializableTypeCode.Array);
                        var arr = value as Array;
                        if (arr != null)
                        {
                            array = new SerializableValue[arr.Length];
                            for (int i = 0; i < arr.Length; i++)
                            {
                                array[i] = new SerializableValue(elemType, arr.GetValue(i));
                            }
                        }
                    }

                    if ((typeCode & SerializableTypeCode.List) == SerializableTypeCode.List)
                    {
                        SerializableTypeCode elemType = typeCode & (~SerializableTypeCode.List);
                        var list = value as IList;
                        if (list != null)
                        {
                            array = new SerializableValue[list.Count];
                            for (int i = 0; i < list.Count; i++)
                            {
                                array[i] = new SerializableValue(elemType, list[i]);
                            }
                        }
                    }
                }

                if (array != null && array.Length > 0)
                {
                    for (int i = 0; i < array.Length; i++)
                    {
                        array[i].OnBeforeSerialize();
                    }
                }

                return;
            }

            base.OnBeforeSerialize();
        }
예제 #2
0
        public static object DeserializeFromString(SerializableTypeCode typeCode, string str)
        {
            object value = null;

            switch (typeCode)
            {
            case SerializableTypeCode.String:
                value = str;
                break;

            case SerializableTypeCode.Double:
            {
                double n;
                if (double.TryParse(str, out n))
                {
                    value = n;
                }
                else
                {
                    value = 0d;
                }
            }
            break;

            case SerializableTypeCode.Single:
            {
                float n;
                if (float.TryParse(str, out n))
                {
                    value = n;
                }
                else
                {
                    value = 0f;
                }
            }
            break;

            case SerializableTypeCode.Int32:
            {
                int n;
                if (int.TryParse(str, out n))
                {
                    value = n;
                }
                else
                {
                    value = 0;
                }
            }
            break;

            case SerializableTypeCode.Boolean:
            {
                bool b;
                if (bool.TryParse(str, out b))
                {
                    value = b;
                }
                else
                {
                    value = false;
                }
            }
            break;

            case SerializableTypeCode.Vector2:
            {
                Vector2  v = new Vector2();
                float    n;
                string[] parts = str.Split(',');
                for (int i = 0; i < parts.Length; i++)
                {
                    if (float.TryParse(parts[i], out n))
                    {
                        v[i] = n;
                    }
                }
                value = v;
            }
            break;

            case SerializableTypeCode.Vector2Int:
            {
                Vector2Int v = new Vector2Int();
                int        n;
                string[]   parts = str.Split(',');
                for (int i = 0; i < parts.Length; i++)
                {
                    if (int.TryParse(parts[i], out n))
                    {
                        v[i] = n;
                    }
                }
                value = v;
            }
            break;

            case SerializableTypeCode.Vector3:
            {
                Vector3  v = new Vector3();
                float    n;
                string[] parts = str.Split(',');
                for (int i = 0; i < parts.Length; i++)
                {
                    if (float.TryParse(parts[i], out n))
                    {
                        v[i] = n;
                    }
                }
                value = v;
            }
            break;

            case SerializableTypeCode.Vector3Int:
            {
                Vector3Int v = new Vector3Int();
                int        n;
                string[]   parts = str.Split(',');
                for (int i = 0; i < parts.Length; i++)
                {
                    if (int.TryParse(parts[i], out n))
                    {
                        v[i] = n;
                    }
                }
                value = v;
            }
            break;

            case SerializableTypeCode.Vector4:
            {
                Vector4  v = new Vector4();
                float    n;
                string[] parts = str.Split(',');
                for (int i = 0; i < parts.Length; i++)
                {
                    if (float.TryParse(parts[i], out n))
                    {
                        v[i] = n;
                    }
                }
                value = v;
            }
            break;

            case SerializableTypeCode.Color:
            {
                Color    v = new Color();
                float    n;
                string[] parts = str.Split(',');
                for (int i = 0; i < parts.Length; i++)
                {
                    if (float.TryParse(parts[i], out n))
                    {
                        v[i] = n;
                    }
                }
                value = v;
            }
            break;

            case SerializableTypeCode.Color32:
            {
                Color32  v = new Color32();
                byte     n;
                string[] parts = str.Split(',');
                for (int i = 0; i < parts.Length; i++)
                {
                    if (byte.TryParse(parts[i], out n))
                    {
                        switch (i)
                        {
                        case 0:
                            v.r = n;
                            break;

                        case 1:
                            v.g = n;
                            break;

                        case 2:
                            v.b = n;
                            break;

                        case 3:
                            v.a = n;
                            break;
                        }
                    }
                }
                value = v;
            }
            break;

            case SerializableTypeCode.AnimationCurve:
                AnimationCurve curve;
                if (!TryParseCurve(str, out curve))
                {
                    curve = AnimationCurve.Linear(0f, 0f, 1f, 1f);
                }
                value = curve;
                break;
            }

            return(value);
        }
예제 #3
0
        public static string SerializeToString(SerializableTypeCode typeCode, object value)
        {
            string str = null;


            switch (typeCode)
            {
            case SerializableTypeCode.String:
                str = value as string;
                break;

            case SerializableTypeCode.Vector2:
            {
                Vector2 v = (Vector2)value;
                str = v.x.ToString() + "," + v.y.ToString();
            }
            break;

            case SerializableTypeCode.Vector2Int:
            {
                Vector2Int v = (Vector2Int)value;
                str = v.x.ToString() + "," + v.y.ToString();
            }
            break;

            case SerializableTypeCode.Vector3:
            {
                Vector3 v = (Vector3)value;
                str = v.x + "," + v.y + "," + v.z;
            }
            break;

            case SerializableTypeCode.Vector3Int:
            {
                Vector3Int v = (Vector3Int)value;
                str = v.x + "," + v.y + "," + v.z;
            }
            break;

            case SerializableTypeCode.Vector4:
            {
                Vector4 v = (Vector4)value;
                str = v.x + "," + v.y + "," + v.z + "," + v.w;
            }
            break;

            case SerializableTypeCode.Color:
            {
                Color v = (Color)value;
                str = v.r + "," + v.g + "," + v.b + "," + v.a;
            }
            break;

            case SerializableTypeCode.Color32:
            {
                Color32 v = (Color32)value;
                str = v.r + "," + v.g + "," + v.b + "," + v.a;
            }
            break;

            case SerializableTypeCode.AnimationCurve:
                AnimationCurve curve = (AnimationCurve)value;
                str = ToCurveString(curve);
                break;

            default:
                if (value != null)
                {
                    str = value.ToString();
                }
                break;
            }
            return(str);
        }
예제 #4
0
        public static Type SerializableTypeCodeToType(SerializableTypeCode typeCode)
        {
            if ((typeCode & SerializableTypeCode.Array) == SerializableTypeCode.Array)
            {
                return(SerializableTypeCodeToType(typeCode).MakeArrayType());
            }
            if ((typeCode & SerializableTypeCode.List) == SerializableTypeCode.List)
            {
                return(typeof(List <>).MakeGenericType(SerializableTypeCodeToType(typeCode)));
            }

            switch (typeCode)
            {
            case SerializableTypeCode.String:
                return(typeof(string));

            case SerializableTypeCode.Int32:
                return(typeof(int));

            case SerializableTypeCode.Single:
                return(typeof(float));

            case SerializableTypeCode.Boolean:
                return(typeof(bool));

            case SerializableTypeCode.DBNull:
                return(typeof(DBNull));

            case SerializableTypeCode.Char:
                return(typeof(char));

            case SerializableTypeCode.SByte:
                return(typeof(sbyte));

            case SerializableTypeCode.Byte:
                return(typeof(byte));

            case SerializableTypeCode.Int16:
                return(typeof(short));

            case SerializableTypeCode.Int64:
                return(typeof(long));

            case SerializableTypeCode.UInt16:
                return(typeof(ushort));

            case SerializableTypeCode.UInt32:
                return(typeof(uint));

            case SerializableTypeCode.UInt64:
                return(typeof(ulong));

            case SerializableTypeCode.Double:
                return(typeof(double));

            case SerializableTypeCode.Decimal:
                return(typeof(decimal));

            case SerializableTypeCode.DateTime:
                return(typeof(DateTime));

            case SerializableTypeCode.UnityObject:
                return(typeof(UnityEngine.Object));

            case SerializableTypeCode.Vector2:
                return(typeof(Vector2));

            case SerializableTypeCode.Vector2Int:
                return(typeof(Vector2Int));

            case SerializableTypeCode.Vector3:
                return(typeof(Vector3));

            case SerializableTypeCode.Vector3Int:
                return(typeof(Vector3Int));

            case SerializableTypeCode.Vector4:
                return(typeof(Vector4));

            case SerializableTypeCode.Color:
                return(typeof(Color));

            case SerializableTypeCode.Color32:
                return(typeof(Color32));

            case SerializableTypeCode.AnimationCurve:
                return(typeof(AnimationCurve));
            }
            return(typeof(object));
        }
예제 #5
0
 public SerializableValue(SerializableTypeCode typeCode, object value)
 {
     this.typeCode = typeCode;
     this.value    = value;
 }
예제 #6
0
        public static SerializableTypeCode TypeToSerializableTypeCode(Type type)
        {
            var typeCode = (SerializableTypeCode)Type.GetTypeCode(type);
            SerializableTypeCode elemTypeCode;


            if (type.IsArray)
            {
                elemTypeCode = TypeToSerializableTypeCode(type.GetElementType());
                if (elemTypeCode != SerializableTypeCode.Object)
                {
                    typeCode = SerializableTypeCode.Array | elemTypeCode;
                }
            }
            if (type.IsGenericType)
            {
                elemTypeCode = TypeToSerializableTypeCode(type.GetGenericArguments()[0]);
                if (type.GetGenericTypeDefinition() == typeof(List <>) && elemTypeCode != SerializableTypeCode.Object)
                {
                    typeCode = SerializableTypeCode.List | elemTypeCode;
                }
            }

            if (typeCode == SerializableTypeCode.Object)
            {
                if (typeof(UnityEngine.Object).IsAssignableFrom(type))
                {
                    typeCode = SerializableTypeCode.UnityObject;
                }
                else
                {
                    if (type == typeof(Vector2))
                    {
                        typeCode = SerializableTypeCode.Vector2;
                    }
                    else if (type == typeof(Vector2Int))
                    {
                        typeCode = SerializableTypeCode.Vector2Int;
                    }
                    else if (type == typeof(Vector3))
                    {
                        typeCode = SerializableTypeCode.Vector3;
                    }
                    else if (type == typeof(Vector3Int))
                    {
                        typeCode = SerializableTypeCode.Vector3Int;
                    }
                    else if (type == typeof(Vector4))
                    {
                        typeCode = SerializableTypeCode.Vector4;
                    }
                    else if (type == typeof(Color))
                    {
                        typeCode = SerializableTypeCode.Color;
                    }
                    else if (type == typeof(Color32))
                    {
                        typeCode = SerializableTypeCode.Color32;
                    }
                    else if (type == typeof(AnimationCurve))
                    {
                        typeCode = SerializableTypeCode.AnimationCurve;
                    }
                }
            }
            return(typeCode);
        }
예제 #7
0
 public SerializableValue(SerializableTypeCode typeCode)
 {
     this.typeCode = typeCode;
 }
예제 #8
0
 public SerializableItemValue(TypeCode typeCode)
 {
     this.typeCode = (SerializableTypeCode)typeCode;
 }