using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Reflection; using SimpleJson.Reflection; namespace SimpleJson { // Token: 0x020002E5 RID: 741 [GeneratedCode("simple-json", "1.0.0")] internal class PocoJsonSerializerStrategy : IJsonSerializerStrategy { // Token: 0x060030AF RID: 12463 RVA: 0x00048130 File Offset: 0x00046330 public PocoJsonSerializerStrategy() { this.ConstructorCache = new ReflectionUtils.ThreadSafeDictionary(new ReflectionUtils.ThreadSafeDictionaryValueFactory(this.ContructorDelegateFactory)); this.GetCache = new ReflectionUtils.ThreadSafeDictionary>(new ReflectionUtils.ThreadSafeDictionaryValueFactory>(this.GetterValueFactory)); this.SetCache = new ReflectionUtils.ThreadSafeDictionary>>(new ReflectionUtils.ThreadSafeDictionaryValueFactory>>(this.SetterValueFactory)); } // Token: 0x060030B0 RID: 12464 RVA: 0x0004818C File Offset: 0x0004638C protected virtual string MapClrMemberNameToJsonFieldName(string clrPropertyName) { return clrPropertyName; } // Token: 0x060030B1 RID: 12465 RVA: 0x000481A4 File Offset: 0x000463A4 internal virtual ReflectionUtils.ConstructorDelegate ContructorDelegateFactory(Type key) { return ReflectionUtils.GetContructor(key, (!key.IsArray) ? PocoJsonSerializerStrategy.EmptyTypes : PocoJsonSerializerStrategy.ArrayConstructorParameterTypes); } // Token: 0x060030B2 RID: 12466 RVA: 0x000481DC File Offset: 0x000463DC internal virtual IDictionary GetterValueFactory(Type type) { IDictionary dictionary = new Dictionary(); foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) { if (propertyInfo.CanRead) { MethodInfo getterMethodInfo = ReflectionUtils.GetGetterMethodInfo(propertyInfo); if (!getterMethodInfo.IsStatic && getterMethodInfo.IsPublic) { dictionary[this.MapClrMemberNameToJsonFieldName(propertyInfo.Name)] = ReflectionUtils.GetGetMethod(propertyInfo); } } } foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) { if (!fieldInfo.IsStatic && fieldInfo.IsPublic) { dictionary[this.MapClrMemberNameToJsonFieldName(fieldInfo.Name)] = ReflectionUtils.GetGetMethod(fieldInfo); } } return dictionary; } // Token: 0x060030B3 RID: 12467 RVA: 0x0004830C File Offset: 0x0004650C internal virtual IDictionary> SetterValueFactory(Type type) { IDictionary> dictionary = new Dictionary>(); foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) { if (propertyInfo.CanWrite) { MethodInfo setterMethodInfo = ReflectionUtils.GetSetterMethodInfo(propertyInfo); if (!setterMethodInfo.IsStatic && setterMethodInfo.IsPublic) { dictionary[this.MapClrMemberNameToJsonFieldName(propertyInfo.Name)] = new KeyValuePair(propertyInfo.PropertyType, ReflectionUtils.GetSetMethod(propertyInfo)); } } } foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) { if (!fieldInfo.IsInitOnly && !fieldInfo.IsStatic && fieldInfo.IsPublic) { dictionary[this.MapClrMemberNameToJsonFieldName(fieldInfo.Name)] = new KeyValuePair(fieldInfo.FieldType, ReflectionUtils.GetSetMethod(fieldInfo)); } } return dictionary; } // Token: 0x060030B4 RID: 12468 RVA: 0x00048460 File Offset: 0x00046660 public virtual bool TrySerializeNonPrimitiveObject(object input, out object output) { return this.TrySerializeKnownTypes(input, out output) || this.TrySerializeUnknownTypes(input, out output); } // Token: 0x060030B5 RID: 12469 RVA: 0x00048490 File Offset: 0x00046690 public virtual object DeserializeObject(object value, Type type) { if (type == null) { throw new ArgumentNullException("type"); } string text = value as string; object obj; if (type == typeof(Guid) && string.IsNullOrEmpty(text)) { obj = default(Guid); } else if (value == null) { obj = null; } else { object obj2 = null; if (text != null) { if (text.Length != 0) { if (type == typeof(DateTime) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTime))) { return DateTime.ParseExact(text, PocoJsonSerializerStrategy.Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal); } if (type == typeof(DateTimeOffset) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTimeOffset))) { return DateTimeOffset.ParseExact(text, PocoJsonSerializerStrategy.Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal); } if (type == typeof(Guid) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid))) { return new Guid(text); } return text; } else { if (type == typeof(Guid)) { obj2 = default(Guid); } else if (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) { obj2 = null; } else { obj2 = text; } if (!ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) { return text; } } } else if (value is bool) { return value; } bool flag = value is long; bool flag2 = value is double; if ((flag && type == typeof(long)) || (flag2 && type == typeof(double))) { obj = value; } else if ((flag2 && type != typeof(double)) || (flag && type != typeof(long))) { obj2 = ((!typeof(IConvertible).IsAssignableFrom(type)) ? value : Convert.ChangeType(value, type, CultureInfo.InvariantCulture)); if (ReflectionUtils.IsNullableType(type)) { obj = ReflectionUtils.ToNullableType(obj2, type); } else { obj = obj2; } } else { IDictionary dictionary = value as IDictionary; if (dictionary != null) { IDictionary dictionary2 = dictionary; if (ReflectionUtils.IsTypeDictionary(type)) { Type[] genericTypeArguments = ReflectionUtils.GetGenericTypeArguments(type); Type type2 = genericTypeArguments[0]; Type type3 = genericTypeArguments[1]; Type type4 = typeof(Dictionary<, >).MakeGenericType(new Type[] { type2, type3 }); IDictionary dictionary3 = (IDictionary)this.ConstructorCache[type4](null); foreach (KeyValuePair keyValuePair in dictionary2) { dictionary3.Add(keyValuePair.Key, this.DeserializeObject(keyValuePair.Value, type3)); } obj2 = dictionary3; } else if (type == typeof(object)) { obj2 = value; } else { obj2 = this.ConstructorCache[type](null); foreach (KeyValuePair> keyValuePair2 in this.SetCache[type]) { object obj3; if (dictionary2.TryGetValue(keyValuePair2.Key, out obj3)) { obj3 = this.DeserializeObject(obj3, keyValuePair2.Value.Key); keyValuePair2.Value.Value(obj2, obj3); } } } } else { IList list = value as IList; if (list != null) { IList list2 = list; IList list3 = null; if (type.IsArray) { list3 = (IList)this.ConstructorCache[type](new object[] { list2.Count }); int num = 0; foreach (object obj4 in list2) { list3[num++] = this.DeserializeObject(obj4, type.GetElementType()); } } else if (ReflectionUtils.IsTypeGenericeCollectionInterface(type) || ReflectionUtils.IsAssignableFrom(typeof(IList), type)) { Type type5 = ReflectionUtils.GetGenericTypeArguments(type)[0]; Type type6 = typeof(List<>).MakeGenericType(new Type[] { type5 }); list3 = (IList)this.ConstructorCache[type6](new object[] { list2.Count }); foreach (object obj5 in list2) { list3.Add(this.DeserializeObject(obj5, type5)); } } obj2 = list3; } } obj = obj2; } } return obj; } // Token: 0x060030B6 RID: 12470 RVA: 0x00048A7C File Offset: 0x00046C7C protected virtual object SerializeEnum(Enum p) { return Convert.ToDouble(p, CultureInfo.InvariantCulture); } // Token: 0x060030B7 RID: 12471 RVA: 0x00048AA4 File Offset: 0x00046CA4 protected virtual bool TrySerializeKnownTypes(object input, out object output) { bool flag = true; if (input is DateTime) { output = ((DateTime)input).ToUniversalTime().ToString(PocoJsonSerializerStrategy.Iso8601Format[0], CultureInfo.InvariantCulture); } else if (input is DateTimeOffset) { output = ((DateTimeOffset)input).ToUniversalTime().ToString(PocoJsonSerializerStrategy.Iso8601Format[0], CultureInfo.InvariantCulture); } else if (input is Guid) { output = ((Guid)input).ToString("D"); } else if (input is Uri) { output = input.ToString(); } else { Enum @enum = input as Enum; if (@enum != null) { output = this.SerializeEnum(@enum); } else { flag = false; output = null; } } return flag; } // Token: 0x060030B8 RID: 12472 RVA: 0x00048B8C File Offset: 0x00046D8C protected virtual bool TrySerializeUnknownTypes(object input, out object output) { if (input == null) { throw new ArgumentNullException("input"); } output = null; Type type = input.GetType(); bool flag; if (type.FullName == null) { flag = false; } else { IDictionary dictionary = new JsonObject(); IDictionary dictionary2 = this.GetCache[type]; foreach (KeyValuePair keyValuePair in dictionary2) { if (keyValuePair.Value != null) { dictionary.Add(this.MapClrMemberNameToJsonFieldName(keyValuePair.Key), keyValuePair.Value(input)); } } output = dictionary; flag = true; } return flag; } // Token: 0x040009A0 RID: 2464 internal IDictionary ConstructorCache; // Token: 0x040009A1 RID: 2465 internal IDictionary> GetCache; // Token: 0x040009A2 RID: 2466 internal IDictionary>> SetCache; // Token: 0x040009A3 RID: 2467 internal static readonly Type[] EmptyTypes = new Type[0]; // Token: 0x040009A4 RID: 2468 internal static readonly Type[] ArrayConstructorParameterTypes = new Type[] { typeof(int) }; // Token: 0x040009A5 RID: 2469 private static readonly string[] Iso8601Format = new string[] { "yyyy-MM-dd\\THH:mm:ss.FFFFFFF\\Z", "yyyy-MM-dd\\THH:mm:ss\\Z", "yyyy-MM-dd\\THH:mm:ssK" }; } }