public override object Value(Type type) { if (OnlineMapsReflectionHelper.IsValueType(type)) { return(Activator.CreateInstance(type)); } return(null); }
public static OnlineMapsJSONItem Serialize(object obj) { #if !UNITY_WP_8_1 || UNITY_EDITOR if (obj == null || obj is DBNull) { return(new OnlineMapsJSONValue(obj, OnlineMapsJSONValue.ValueType.NULL)); } #else if (obj == null) { return(new OnlineMapsJSONValue(obj, OnlineMapsJSONValue.ValueType.NULL)); } #endif if (obj is string || obj is bool || obj is int || obj is long || obj is short || obj is float || obj is double) { return(new OnlineMapsJSONValue(obj)); } if (obj is IEnumerable) { IEnumerable v = (IEnumerable)obj; OnlineMapsJSONArray array = new OnlineMapsJSONArray(); foreach (var item in v) { array.Add(Serialize(item)); } return(array); } OnlineMapsJSONObject o = new OnlineMapsJSONObject(); Type type = obj.GetType(); IEnumerable <FieldInfo> fields = OnlineMapsReflectionHelper.GetFields(type, BindingFlags.Instance | BindingFlags.Public); foreach (FieldInfo field in fields) { o.Add(field.Name, Serialize(field.GetValue(obj))); } return(o); }
private static object DeserializeArray(Type type, List <object> list) { if (list == null || list.Count == 0) { return(null); } if (type.IsArray) { Type elementType = type.GetElementType(); Array v = Array.CreateInstance(elementType, list.Count); for (int i = 0; i < list.Count; i++) { object child = list[i]; object item; if (child is IDictionary) { item = DeserializeObject(elementType, child as Dictionary <string, object>); } else if (child is IList) { item = DeserializeArray(elementType, child as List <object>); } else { item = DeserializeValue(elementType, child); } v.SetValue(item, i); } return(v); } if (OnlineMapsReflectionHelper.IsGenericType(type)) { Type listType = OnlineMapsReflectionHelper.GetGenericArguments(type)[0]; object v = Activator.CreateInstance(type); for (int i = 0; i < list.Count; i++) { object child = list[i]; object item; if (child is IDictionary) { item = DeserializeObject(listType, child as Dictionary <string, object>); } else if (child is IList) { item = DeserializeArray(listType, child as List <object>); } else { item = DeserializeValue(listType, child); } try { MethodInfo methodInfo = OnlineMapsReflectionHelper.GetMethod(type, "Add"); if (methodInfo != null) { methodInfo.Invoke(v, new[] { item }); } } catch { } } return(v); } return(null); }
private static object DeserializeObject(Type type, Dictionary <string, object> table) { IEnumerable <MemberInfo> members = OnlineMapsReflectionHelper.GetMembers(type, BindingFlags.Instance | BindingFlags.Public); object v = Activator.CreateInstance(type); foreach (MemberInfo member in members) { #if !NETFX_CORE MemberTypes memberType = member.MemberType; if (memberType != MemberTypes.Field && memberType != MemberTypes.Property) { continue; } #else MemberTypes memberType; if (member is PropertyInfo) { memberType = MemberTypes.Property; } else if (member is FieldInfo) { memberType = MemberTypes.Field; } else { continue; } #endif if (memberType == MemberTypes.Property && !((PropertyInfo)member).CanWrite) { continue; } object item; #if !NETFX_CORE object[] attributes = member.GetCustomAttributes(typeof(AliasAttribute), true); AliasAttribute alias = attributes.Length > 0 ? attributes[0] as AliasAttribute : null; #else IEnumerable <Attribute> attributes = member.GetCustomAttributes(typeof(AliasAttribute), true); AliasAttribute alias = null; foreach (Attribute a in attributes) { alias = a as AliasAttribute; break; } #endif if (alias == null || !alias.ignoreFieldName) { if (table.TryGetValue(member.Name, out item)) { DeserializeValue(memberType, member, item, v); continue; } } if (alias != null) { for (int j = 0; j < alias.aliases.Length; j++) { if (table.TryGetValue(alias.aliases[j], out item)) { DeserializeValue(memberType, member, item, v); break; } } } } return(v); }
public override object Deserialize(Type type) { IEnumerable <MemberInfo> members = OnlineMapsReflectionHelper.GetMembers(type, BindingFlags.Instance | BindingFlags.Public); return(Deserialize(type, members)); }
public override object Value(Type t) { if (_type == ValueType.NULL || _value == null) { if (OnlineMapsReflectionHelper.IsValueType(t)) { return(Activator.CreateInstance(t)); } return(null); } if (t == typeof(string)) { return(Convert.ChangeType(_value, t)); } if (_type == ValueType.BOOLEAN) { if (t == typeof(bool)) { return(Convert.ChangeType(_value, t)); } } else if (_type == ValueType.DOUBLE) { if (t == typeof(double)) { return(Convert.ChangeType(_value, t, OnlineMapsUtils.numberFormat)); } if (t == typeof(float)) { return(Convert.ChangeType((double)_value, t, OnlineMapsUtils.numberFormat)); } } else if (_type == ValueType.LONG) { if (t == typeof(long)) { return(Convert.ChangeType(_value, t)); } #if UNITY_EDITOR if (t.IsSubclassOf(typeof(UnityEngine.Object))) { return(UnityEditor.EditorUtility.InstanceIDToObject((int)(long)_value)); } #endif try { return(Convert.ChangeType((long)_value, t)); } catch (Exception e) { Debug.Log(e.Message + "\n" + e.StackTrace); return(null); } } else if (_type == ValueType.STRING) { MethodInfo method = OnlineMapsReflectionHelper.GetMethod(t, "Parse", new[] { typeof(string), typeof(IFormatProvider) }); if (method != null) { return(method.Invoke(null, new object[] { value, OnlineMapsUtils.numberFormat })); } method = OnlineMapsReflectionHelper.GetMethod(t, "Parse", new[] { typeof(string) }); return(method.Invoke(null, new[] { value })); } StringBuilder builder = new StringBuilder(); ToJSON(builder); throw new InvalidCastException(t.FullName + "\n" + builder); }
public void DeserializeObject(object obj, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public) { IEnumerable <MemberInfo> members = OnlineMapsReflectionHelper.GetMembers(obj.GetType(), bindingFlags); DeserializeObject(obj, members); }
public override object Deserialize(Type type) { if (_count == 0) { return(null); } if (type.IsArray) { Type elementType = type.GetElementType(); Array v = Array.CreateInstance(elementType, _count); if (array[0] is OnlineMapsJSONObject) { IEnumerable <MemberInfo> members = OnlineMapsReflectionHelper.GetMembers(elementType, BindingFlags.Instance | BindingFlags.Public); for (int i = 0; i < _count; i++) { OnlineMapsJSONItem child = array[i]; object item = (child as OnlineMapsJSONObject).Deserialize(elementType, members); v.SetValue(item, i); } } else { for (int i = 0; i < _count; i++) { OnlineMapsJSONItem child = array[i]; object item = child.Deserialize(elementType); v.SetValue(item, i); } } return(v); } if (OnlineMapsReflectionHelper.IsGenericType(type)) { Type listType = OnlineMapsReflectionHelper.GetGenericArguments(type)[0]; object v = Activator.CreateInstance(type); if (array[0] is OnlineMapsJSONObject) { IEnumerable <MemberInfo> members = OnlineMapsReflectionHelper.GetMembers(listType, BindingFlags.Instance | BindingFlags.Public); for (int i = 0; i < _count; i++) { OnlineMapsJSONItem child = array[i]; object item = (child as OnlineMapsJSONObject).Deserialize(listType, members); try { MethodInfo methodInfo = OnlineMapsReflectionHelper.GetMethod(type, "Add"); if (methodInfo != null) { methodInfo.Invoke(v, new[] { item }); } } catch { } } } else { for (int i = 0; i < _count; i++) { OnlineMapsJSONItem child = array[i]; object item = child.Deserialize(listType); try { MethodInfo methodInfo = OnlineMapsReflectionHelper.GetMethod(type, "Add"); if (methodInfo != null) { methodInfo.Invoke(v, new[] { item }); } } catch { } } } return(v); } return(null); }
public override object Value(Type t) { if (_type == ValueType.NULL || _value == null) { if (OnlineMapsReflectionHelper.IsValueType(t)) { return(Activator.CreateInstance(t)); } return(null); } if (t == typeof(string)) { return(Convert.ChangeType(_value, t)); } if (_type == ValueType.BOOLEAN) { if (t == typeof(bool)) { return(Convert.ChangeType(_value, t)); } } else if (_type == ValueType.DOUBLE) { if (t == typeof(double)) { return(Convert.ChangeType(_value, t)); } if (t == typeof(float)) { return(Convert.ChangeType((double)_value, t)); } } else if (_type == ValueType.LONG) { if (t == typeof(long)) { return(Convert.ChangeType(_value, t)); } if (t == typeof(int)) { return(Convert.ChangeType((long)_value, t)); } if (t == typeof(float)) { return(Convert.ChangeType((long)_value, t)); } if (t == typeof(double)) { return(Convert.ChangeType((long)_value, t)); } } else if (_type == ValueType.STRING) { MethodInfo method = OnlineMapsReflectionHelper.GetMethod(t, "Parse", new[] { typeof(string) }); if (method != null) { return(method.Invoke(null, new[] { _value })); } return(null); } StringBuilder builder = new StringBuilder(); ToJSON(builder); throw new InvalidCastException(t.FullName + "\n" + builder); }
public override void Append(StringBuilder builder) { base.Append(builder); builder.Append("&coordinates="); for (int i = 0; i < coordinates.Length; i++) { if (i > 0) { builder.Append("|"); } OnlineMapsVector2d c = coordinates[i]; builder.Append(c.x).Append(",").Append(c.y); } builder.Append("&profile=").Append(OnlineMapsReflectionHelper.GetEnumDescription(profile)); if (preference.HasValue) { builder.Append("&preference=").Append(preference); } if (units.HasValue) { builder.Append("&units=").Append(units); } if (!string.IsNullOrEmpty(language)) { builder.Append("&language=").Append(language); } if (geometry.HasValue) { builder.Append("&geometry=").Append(geometry.Value); } if (geometry_format.HasValue) { builder.Append("&geometry_format=").Append(geometry_format.Value); } if (geometry_simplify.HasValue) { builder.Append("&geometry_simplify=").Append(geometry_simplify.Value); } if (instructions.HasValue) { builder.Append("&instructions=").Append(instructions.Value); } if (instructions_format.HasValue) { builder.Append("&instructions_format=").Append(instructions_format.Value); } if (elevation.HasValue) { builder.Append("&elevation=").Append(elevation.Value); } if (extra_info != null) { builder.Append("&extra_info="); for (int i = 0; i < extra_info.Length; i++) { if (i > 0) { builder.Append("|"); } builder.Append(extra_info[i]); } } if (!string.IsNullOrEmpty(options)) { builder.Append("&options=").Append(options); } }
/// <summary> /// Serializes an object to JSON. /// </summary> /// <param name="obj">Object</param> /// <returns>JSON</returns> public static OnlineMapsJSONItem Serialize(object obj) { #if !UNITY_WP_8_1 || UNITY_EDITOR if (obj == null || obj is DBNull) { return(new OnlineMapsJSONValue(obj, OnlineMapsJSONValue.ValueType.NULL)); } #else if (obj == null) { return(new OnlineMapsJSONValue(obj, OnlineMapsJSONValue.ValueType.NULL)); } #endif if (obj is string || obj is bool || obj is int || obj is long || obj is short || obj is float || obj is double) { return(new OnlineMapsJSONValue(obj)); } if (obj is UnityEngine.Object) { if (!(obj is Component || obj is ScriptableObject)) { return(new OnlineMapsJSONValue((obj as UnityEngine.Object).GetInstanceID())); } } if (obj is IDictionary) { IDictionary d = obj as IDictionary; OnlineMapsJSONObject dv = new OnlineMapsJSONObject(); ICollection keys = d.Keys; ICollection values = d.Values; IEnumerator keysEnum = keys.GetEnumerator(); IEnumerator valuesEnum = values.GetEnumerator(); while (keysEnum.MoveNext() && valuesEnum.MoveNext()) { object k = keysEnum.Current; object v = valuesEnum.Current; dv.Add(k as string, Serialize(v)); } return(dv); } if (obj is IEnumerable) { IEnumerable v = (IEnumerable)obj; OnlineMapsJSONArray array = new OnlineMapsJSONArray(); foreach (var item in v) { array.Add(Serialize(item)); } return(array); } OnlineMapsJSONObject o = new OnlineMapsJSONObject(); Type type = obj.GetType(); BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public; if (OnlineMapsReflectionHelper.CheckIfAnonymousType(type)) { bindingFlags |= BindingFlags.NonPublic; } IEnumerable <FieldInfo> fields = OnlineMapsReflectionHelper.GetFields(type, bindingFlags); foreach (FieldInfo field in fields) { string fieldName = field.Name; if (field.Attributes == (FieldAttributes.Private | FieldAttributes.InitOnly)) { fieldName = fieldName.Trim('<', '>'); } o.Add(fieldName, Serialize(field.GetValue(obj))); } return(o); }