private object DeserializeValue(Type type) { _reader.SkipWhiteSpaces(); var isNullable = false; if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>)) { isNullable = true; type = Nullable.GetUnderlyingType(type); } if (type == typeof(int)) { return(_reader.ReadInt32(isNullable)); } if (type == typeof(string)) { return(_reader.ReadString()); } if (type == typeof(double)) { return(_reader.ReadDouble(isNullable)); } if (type == typeof(DateTime)) { return(_reader.ReadDateTime(isNullable)); } if (_IEnumerableType.IsAssignableFrom(type)) { return(DeserializeList(type)); } if (type == typeof(char)) { return(_reader.ReadChar()); } if (type == typeof(bool)) { return(_reader.ReadBool(isNullable)); } if (type.IsEnum) { return(_reader.ReadEnum(type)); } if (type == typeof(long)) { return(_reader.ReadInt64(isNullable)); } if (type == typeof(float)) { return(_reader.ReadFloat(isNullable)); } if (type == typeof(decimal)) { return(_reader.ReadDecimal(isNullable)); } if (type == typeof(short)) { return(_reader.ReadInt16(isNullable)); } if (type == typeof(object)) { return(_reader.ReadObject()); } return(ParseObject(type)); }