From 5f48a30725172b48064c8965e44d4294756a8594 Mon Sep 17 00:00:00 2001 From: Igor Russkih Date: Thu, 7 Jul 2011 13:17:10 +0400 Subject: [PATCH] More netcf compat fixes. ModelReader now works fine --- .../CodeGen/DynamicMethodGenerator_NoEmit.cs | 16 ++++++- src/JsonFx/Json/JsonTokenizer.cs | 42 ++++++++++--------- src/JsonFx/Model/Filters/Iso8601DateFilter.cs | 9 ++-- .../Serialization/Resolvers/ResolverCache.cs | 24 +++++++++-- .../Serialization/TypeCoercionUtility.cs | 41 ++++++++++-------- 5 files changed, 85 insertions(+), 47 deletions(-) diff --git a/src/JsonFx/CodeGen/DynamicMethodGenerator_NoEmit.cs b/src/JsonFx/CodeGen/DynamicMethodGenerator_NoEmit.cs index a46b071..32e731f 100644 --- a/src/JsonFx/CodeGen/DynamicMethodGenerator_NoEmit.cs +++ b/src/JsonFx/CodeGen/DynamicMethodGenerator_NoEmit.cs @@ -118,7 +118,13 @@ public static GetterDelegate GetPropertyGetter(PropertyInfo propertyInfo) return delegate(object instance) { - return methodInfo.Invoke(instance, Type.EmptyTypes); + return methodInfo.Invoke(instance, +#if NETCF + new Type[]{} +#else + Type.EmptyTypes +#endif + ); }; } @@ -282,7 +288,13 @@ public static FactoryDelegate GetTypeFactory(Type type) throw new ArgumentNullException("type"); } - ConstructorInfo ctor = type.GetConstructor(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.FlattenHierarchy, null, Type.EmptyTypes, null); + ConstructorInfo ctor = type.GetConstructor(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.FlattenHierarchy, null, +#if NETCF + new Type[]{}, +#else + Type.EmptyTypes, +#endif + null); if (ctor == null) { return null; diff --git a/src/JsonFx/Json/JsonTokenizer.cs b/src/JsonFx/Json/JsonTokenizer.cs index a26c4b4..2a439cc 100644 --- a/src/JsonFx/Json/JsonTokenizer.cs +++ b/src/JsonFx/Json/JsonTokenizer.cs @@ -526,13 +526,13 @@ private static Token ScanNumber(ITextStream scanner) if (!hasDecimal && !hasExponent && precision < 19) { // Integer value - decimal number; - if (!Decimal.TryParse( - buffer, - NumberStyles.Integer, - NumberFormatInfo.InvariantInfo, - out number)) - { + decimal number = 0; + try{ + Decimal.Parse( + buffer, + NumberStyles.Integer, + NumberFormatInfo.InvariantInfo); + }catch(Exception){ throw new DeserializationException(JsonTokenizer.ErrorIllegalNumber, numPos, numLine, numCol); } @@ -555,12 +555,12 @@ private static Token ScanNumber(ITextStream scanner) { // Floating Point value double number; - if (!Double.TryParse( - buffer, - NumberStyles.Float, - NumberFormatInfo.InvariantInfo, - out number)) - { + try{ + number = Double.Parse( + buffer, + NumberStyles.Float, + NumberFormatInfo.InvariantInfo); + }catch(Exception){ throw new DeserializationException(JsonTokenizer.ErrorIllegalNumber, numPos, numLine, numCol); } @@ -698,13 +698,15 @@ private static string ScanString(ITextStream scanner) } // unicode ordinal - int utf16; - if (escapeSeq.Length == UnicodeEscapeLength && - Int32.TryParse( - escapeSeq, - NumberStyles.AllowHexSpecifier, - NumberFormatInfo.InvariantInfo, - out utf16)) + int utf16 = 0; + bool parsed = true; + try{ + utf16 = Int32.Parse( + escapeSeq, + NumberStyles.AllowHexSpecifier, + NumberFormatInfo.InvariantInfo); + }catch(Exception){ parsed = false; }; + if (escapeSeq.Length == UnicodeEscapeLength && parsed) { buffer.Append(CharUtility.ConvertFromUtf32(utf16)); } diff --git a/src/JsonFx/Model/Filters/Iso8601DateFilter.cs b/src/JsonFx/Model/Filters/Iso8601DateFilter.cs index 8504c5b..80c378e 100644 --- a/src/JsonFx/Model/Filters/Iso8601DateFilter.cs +++ b/src/JsonFx/Model/Filters/Iso8601DateFilter.cs @@ -178,13 +178,14 @@ public override bool TryWrite(DataWriterSettings settings, DateTime value, out I /// true if parsing was successful private static bool TryParseIso8601(string date, out DateTime value) { - if (!DateTime.TryParseExact( + try{ + value = DateTime.ParseExact( date, Iso8601DateFilter.FullFormat, CultureInfo.InvariantCulture, - DateTimeStyles.RoundtripKind|DateTimeStyles.AllowWhiteSpaces|DateTimeStyles.NoCurrentDateDefault, - out value)) - { + DateTimeStyles.RoundtripKind|DateTimeStyles.AllowWhiteSpaces|DateTimeStyles.NoCurrentDateDefault + ); + }catch(Exception){ value = default(DateTime); return false; } diff --git a/src/JsonFx/Serialization/Resolvers/ResolverCache.cs b/src/JsonFx/Serialization/Resolvers/ResolverCache.cs index 9442949..3b7e3e5 100644 --- a/src/JsonFx/Serialization/Resolvers/ResolverCache.cs +++ b/src/JsonFx/Serialization/Resolvers/ResolverCache.cs @@ -237,7 +237,10 @@ public FactoryMap(Type type) Type argType = paramList[0].ParameterType; if ((argType == typeof(string)) || - ((argType.GetInterface(TypeCoercionUtility.TypeGenericIEnumerable, false) == null) && + ( +#if !NETCF + (argType.GetInterface(TypeCoercionUtility.TypeGenericIEnumerable, false) == null) && +#endif (typeof(IEnumerable).IsAssignableFrom(argType)))) { continue; @@ -268,7 +271,10 @@ public FactoryMap(Type type) // many collection types have an Add method // which adds items one at a time - Type collectionType = type.GetInterface(TypeCoercionUtility.TypeGenericICollection, false); + Type collectionType = null; +#if !NETCF + collectionType = type.GetInterface(TypeCoercionUtility.TypeGenericICollection, false); +#endif if (collectionType != null) { methodInfo = collectionType.GetMethod("Add"); @@ -302,7 +308,11 @@ public IEnumerable ArgTypes { if (this.CollectionCtors == null) { +#if NETCF + return new Type[]{ }; +#else return Type.EmptyTypes; +#endif } return this.CollectionCtors.Keys; @@ -348,7 +358,15 @@ internal static bool IsImmutableType(Type type) return !type.IsInterface && !type.IsAbstract && - (type.IsValueType || (type.GetConstructor(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.FlattenHierarchy, null, Type.EmptyTypes, null) == null)); + (type.IsValueType || + (type.GetConstructor(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.FlattenHierarchy, + null, +#if NETCF + new Type[]{ }, +#else + Type.EmptyTypes, +#endif + null) == null)); } #endregion Utility Methods diff --git a/src/JsonFx/Serialization/TypeCoercionUtility.cs b/src/JsonFx/Serialization/TypeCoercionUtility.cs index 593eea3..2cbc412 100644 --- a/src/JsonFx/Serialization/TypeCoercionUtility.cs +++ b/src/JsonFx/Serialization/TypeCoercionUtility.cs @@ -252,7 +252,11 @@ internal void SetMemberValue(object target, Type targetType, MemberMap memberMap ((System.Dynamic.DynamicObject)target).TrySetMember(new DynamicSetter(memberName), memberValue); } #endif - else if (targetType != null && targetType.GetInterface(TypeCoercionUtility.TypeGenericIDictionary, false) != null) + else if (targetType != null +#if !NETCF + && targetType.GetInterface(TypeCoercionUtility.TypeGenericIDictionary, false) != null +#endif + ) { throw new TypeCoercionException(String.Format( TypeCoercionUtility.ErrorGenericIDictionary, @@ -368,18 +372,17 @@ public object CoerceType(Type targetType, object value) if (targetType == typeof(DateTime)) { DateTime date; - if (DateTime.TryParse( + try{ + date = DateTime.Parse( (string)value, CultureInfo.InvariantCulture, - DateTimeStyles.RoundtripKind|DateTimeStyles.AllowWhiteSpaces|DateTimeStyles.NoCurrentDateDefault, - out date)) - { + DateTimeStyles.RoundtripKind|DateTimeStyles.AllowWhiteSpaces|DateTimeStyles.NoCurrentDateDefault); if (date.Kind == DateTimeKind.Local) { return date.ToUniversalTime(); } return date; - } + }catch(Exception){} if (JsonFx.Model.Filters.MSAjaxDateFilter.TryParseMSAjaxDate( (string)value, @@ -415,16 +418,12 @@ public object CoerceType(Type targetType, object value) } else if (targetType == typeof(TimeSpan)) { - long ticks; - if (Int64.TryParse((string)value, out ticks)) - { - return TimeSpan.FromTicks(ticks); - } - TimeSpan timespan; - if (TimeSpan.TryParse((string)value, out timespan)) - { - return timespan; - } + try{ + return TimeSpan.FromTicks(Int64.Parse((string)value)); + }catch(Exception){} + try{ + return TimeSpan.Parse((string)value); + }catch(Exception){} } } else if (targetType == typeof(TimeSpan)) @@ -781,7 +780,10 @@ internal static Type GetDictionaryItemType(Type targetType) return null; } - Type dictionaryType = targetType.GetInterface(TypeCoercionUtility.TypeGenericIDictionary, false); + Type dictionaryType = null; +#if !NETCF + dictionaryType = targetType.GetInterface(TypeCoercionUtility.TypeGenericIDictionary, false); +#endif if (dictionaryType == null) { // not an IDictionary @@ -821,7 +823,10 @@ internal static Type GetElementType(Type targetType) return targetType.GetElementType(); } - Type arrayType = targetType.GetInterface(TypeCoercionUtility.TypeGenericIEnumerable, false); + Type arrayType = null; +#if !NETCF + arrayType = targetType.GetInterface(TypeCoercionUtility.TypeGenericIEnumerable, false); +#endif if (arrayType == null) { // not an IEnumerable