/*----------Functions----------*/
        //PRIVATE

        /// <summary>
        /// Check to see if the supplied type can be processed
        /// </summary>
        /// <param name="type">The type of object that is being tested</param>
        /// <returns>Returns true if the type can be processed</returns>
        private static bool CanProcessTypeValue(Type type)
        {
            //If the type is stored in the basic types lookup, its good
            if (BASIC_TYPE_LOOKUP.Contains(type))
            {
                return(true);
            }

            //Check the other basic types
            if (type == CHAR)
            {
                return(true);
            }
            if (UOBJ.IsAssignableFrom(type))
            {
                return(true);
            }
            if (ENUM.IsAssignableFrom(type))
            {
                return(true);
            }

            //Can't process a generic object only
            if (type == OBJ)
            {
                return(false);
            }

            //Otherwise check it is a value or has a default constructor
            return(type.IsValueType || type.GetConstructor(Type.EmptyTypes) != null);
        }
        /// <summary>
        /// Retrieve the serialised value for a single object
        /// </summary>
        /// <param name="obj">The object that is to be serialsied</param>
        /// <param name="type">The type of object that is being serialised</param>
        /// <returns>Returns the value as a serialised string</returns>
        private static string SerialiseValue(object obj, Type type)
        {
            //If the object is a basic type, just to string it
            if (BASIC_TYPE_LOOKUP.Contains(type))
            {
                return(obj != null ? obj.ToString() : string.Empty);
            }

            //If this is a char, use the integral value
            if (type == CHAR)
            {
                return(((short)(char)obj).ToString());
            }

            //If a Unity object, serialise an object container
            if (UOBJ.IsAssignableFrom(type))
            {
                return(JsonUtility.ToJson(new SerialUnityObjectContainer {
                    obj = obj as UnityEngine.Object
                }));
            }

            //If the object is an enum
            if (ENUM.IsAssignableFrom(type))
            {
                return(JsonUtility.ToJson(new SerialCollectionContainer {
                    vals = new string[] {
                        MinifyTypeAssemblyName(type),
                        Convert.ToInt64(obj).ToString()
                    }
                }));
            }

            //At this point, use JsonUtility to manage other types
            return(JsonUtility.ToJson(obj));
        }
        /// <summary>
        /// Parse the supplied text to an object of the specified type
        /// </summary>
        /// <param name="serial">The serialised data that is to be parsed to re-create the object definition</param>
        /// <param name="type">The type of the object that is to be returned by this operation</param>
        /// <returns>Returns a generic object of the specified type</returns>
        private static object ParseValue(string serial, Type type)
        {
            //Check if the object is one of the default types
            if (type == SBYTE)
            {
                sbyte val;    sbyte.TryParse(serial, out val);    return(val);
            }
            if (type == SHORT)
            {
                short val;    short.TryParse(serial, out val);    return(val);
            }
            if (type == INT)
            {
                int val;      int.TryParse(serial, out val);      return(val);
            }
            if (type == LONG)
            {
                long val;     long.TryParse(serial, out val);     return(val);
            }
            if (type == BYTE)
            {
                byte val;     byte.TryParse(serial, out val);     return(val);
            }
            if (type == USHORT)
            {
                ushort val;   ushort.TryParse(serial, out val);   return(val);
            }
            if (type == UINT)
            {
                uint val;     uint.TryParse(serial, out val);     return(val);
            }
            if (type == ULONG)
            {
                ulong val;    ulong.TryParse(serial, out val);    return(val);
            }
            if (type == FLOAT)
            {
                float val;    float.TryParse(serial, out val);    return(val);
            }
            if (type == DOUBLE)
            {
                double val;   double.TryParse(serial, out val);   return(val);
            }
            if (type == DECIMAL)
            {
                decimal val;  decimal.TryParse(serial, out val);  return(val);
            }
            if (type == BOOL)
            {
                bool val;     bool.TryParse(serial, out val);     return(val);
            }
            if (type == STRING)
            {
                return(serial);
            }
            if (type == CHAR)
            {
                short val;    short.TryParse(serial, out val);    return((char)val);
            }

            //If this is a Unity Engine object, deserialise the usual way
            if (UOBJ.IsAssignableFrom(type))
            {
                //Deserialise the object container
                SerialUnityObjectContainer objectContainer = JsonUtility.FromJson <SerialUnityObjectContainer>(serial);

                //Return the object reference value
                return(objectContainer.obj);
            }

            //If the object is an enumeration
            if (ENUM.IsAssignableFrom(type))
            {
                //Deserialise a container object
                SerialCollectionContainer container = JsonUtility.FromJson <SerialCollectionContainer>(serial);

                //There should be two values in the container
                if (container.vals.Length != 2)
                {
                    throw new ArgumentException("Serialised enumeration data has two values for processing. Received " + container.vals.Length);
                }

                //Determine the type that is being used
                Type enumType = Type.GetType(container.vals[0]);

                //Get the integral value to use
                long val = Convert.ToInt64(container.vals[1]);

                //Return the final value converted to the enumeration
                return(Enum.ToObject(enumType, val));
            }

            //At this point, use JsonUtility to manage other types
            return(JsonUtility.FromJson(serial, type));
        }