1717
1818namespace ServiceStack . Text . Common
1919{
20- internal static class DeserializeArrayWithElements < TSerializer >
21- where TSerializer : ITypeSerializer
22- {
23- private static Dictionary < Type , ParseArrayOfElementsDelegate > ParseDelegateCache
24- = new Dictionary < Type , ParseArrayOfElementsDelegate > ( ) ;
20+ internal static class DeserializeArrayWithElements < TSerializer >
21+ where TSerializer : ITypeSerializer
22+ {
23+ private static Dictionary < Type , ParseArrayOfElementsDelegate > ParseDelegateCache
24+ = new Dictionary < Type , ParseArrayOfElementsDelegate > ( ) ;
2525
26- private delegate object ParseArrayOfElementsDelegate ( string value , ParseStringDelegate parseFn ) ;
26+ private delegate object ParseArrayOfElementsDelegate ( string value , ParseStringDelegate parseFn ) ;
2727
28- public static Func < string , ParseStringDelegate , object > GetParseFn ( Type type )
29- {
30- ParseArrayOfElementsDelegate parseFn ;
31- if ( ParseDelegateCache . TryGetValue ( type , out parseFn ) ) return parseFn . Invoke ;
28+ public static Func < string , ParseStringDelegate , object > GetParseFn ( Type type )
29+ {
30+ ParseArrayOfElementsDelegate parseFn ;
31+ if ( ParseDelegateCache . TryGetValue ( type , out parseFn ) ) return parseFn . Invoke ;
3232
3333 var genericType = typeof ( DeserializeArrayWithElements < , > ) . MakeGenericType ( type , typeof ( TSerializer ) ) ;
3434 var mi = genericType . GetMethod ( "ParseGenericArray" , BindingFlags . Public | BindingFlags . Static ) ;
@@ -44,78 +44,78 @@ public static Func<string, ParseStringDelegate, object> GetParseFn(Type type)
4444 } while ( ! ReferenceEquals (
4545 Interlocked . CompareExchange ( ref ParseDelegateCache , newCache , snapshot ) , snapshot ) ) ;
4646
47- return parseFn . Invoke ;
48- }
49- }
50-
51- internal static class DeserializeArrayWithElements < T , TSerializer >
52- where TSerializer : ITypeSerializer
53- {
54- private static readonly ITypeSerializer Serializer = JsWriter . GetTypeSerializer < TSerializer > ( ) ;
55-
56- public static T [ ] ParseGenericArray ( string value , ParseStringDelegate elementParseFn )
57- {
58- if ( ( value = DeserializeListWithElements < TSerializer > . StripList ( value ) ) == null ) return null ;
59- if ( value == string . Empty ) return new T [ 0 ] ;
60-
61- if ( value [ 0 ] == JsWriter . MapStartChar )
62- {
63- var itemValues = new List < string > ( ) ;
64- var i = 0 ;
65- do
66- {
67- itemValues . Add ( Serializer . EatTypeValue ( value , ref i ) ) ;
68- Serializer . EatItemSeperatorOrMapEndChar ( value , ref i ) ;
69- } while ( i < value . Length ) ;
70-
71- var results = new T [ itemValues . Count ] ;
72- for ( var j = 0 ; j < itemValues . Count ; j ++ )
73- {
74- results [ j ] = ( T ) elementParseFn ( itemValues [ j ] ) ;
75- }
76- return results ;
77- }
78- else
79- {
80- var to = new List < T > ( ) ;
81- var valueLength = value . Length ;
82-
83- var i = 0 ;
84- while ( i < valueLength )
85- {
86- var elementValue = Serializer . EatValue ( value , ref i ) ;
87- var listValue = elementValue ;
88- to . Add ( ( T ) elementParseFn ( listValue ) ) ;
89- if ( Serializer . EatItemSeperatorOrMapEndChar ( value , ref i )
47+ return parseFn . Invoke ;
48+ }
49+ }
50+
51+ internal static class DeserializeArrayWithElements < T , TSerializer >
52+ where TSerializer : ITypeSerializer
53+ {
54+ private static readonly ITypeSerializer Serializer = JsWriter . GetTypeSerializer < TSerializer > ( ) ;
55+
56+ public static T [ ] ParseGenericArray ( string value , ParseStringDelegate elementParseFn )
57+ {
58+ if ( ( value = DeserializeListWithElements < TSerializer > . StripList ( value ) ) == null ) return null ;
59+ if ( value == string . Empty ) return new T [ 0 ] ;
60+
61+ if ( value [ 0 ] == JsWriter . MapStartChar )
62+ {
63+ var itemValues = new List < string > ( ) ;
64+ var i = 0 ;
65+ do
66+ {
67+ itemValues . Add ( Serializer . EatTypeValue ( value , ref i ) ) ;
68+ Serializer . EatItemSeperatorOrMapEndChar ( value , ref i ) ;
69+ } while ( i < value . Length ) ;
70+
71+ var results = new T [ itemValues . Count ] ;
72+ for ( var j = 0 ; j < itemValues . Count ; j ++ )
73+ {
74+ results [ j ] = ( T ) elementParseFn ( itemValues [ j ] ) ;
75+ }
76+ return results ;
77+ }
78+ else
79+ {
80+ var to = new List < T > ( ) ;
81+ var valueLength = value . Length ;
82+
83+ var i = 0 ;
84+ while ( i < valueLength )
85+ {
86+ var elementValue = Serializer . EatValue ( value , ref i ) ;
87+ var listValue = elementValue ;
88+ to . Add ( ( T ) elementParseFn ( listValue ) ) ;
89+ if ( Serializer . EatItemSeperatorOrMapEndChar ( value , ref i )
9090 && i == valueLength )
91- {
91+ {
9292 // If we ate a separator and we are at the end of the value,
9393 // it means the last element is empty => add default
9494 to . Add ( default ( T ) ) ;
95- }
96- }
97-
98- return to . ToArray ( ) ;
99- }
100- }
101- }
102-
103- internal static class DeserializeArray < TSerializer >
104- where TSerializer : ITypeSerializer
105- {
106- private static Dictionary < Type , ParseStringDelegate > ParseDelegateCache = new Dictionary < Type , ParseStringDelegate > ( ) ;
107-
108- public static ParseStringDelegate GetParseFn ( Type type )
109- {
110- ParseStringDelegate parseFn ;
95+ }
96+ }
97+
98+ return to . ToArray ( ) ;
99+ }
100+ }
101+ }
102+
103+ internal static class DeserializeArray < TSerializer >
104+ where TSerializer : ITypeSerializer
105+ {
106+ private static Dictionary < Type , ParseStringDelegate > ParseDelegateCache = new Dictionary < Type , ParseStringDelegate > ( ) ;
107+
108+ public static ParseStringDelegate GetParseFn ( Type type )
109+ {
110+ ParseStringDelegate parseFn ;
111111 if ( ParseDelegateCache . TryGetValue ( type , out parseFn ) ) return parseFn ;
112112
113113 var genericType = typeof ( DeserializeArray < , > ) . MakeGenericType ( type , typeof ( TSerializer ) ) ;
114114 var mi = genericType . GetMethod ( "GetParseFn" , BindingFlags . Public | BindingFlags . Static ) ;
115115 var parseFactoryFn = ( Func < ParseStringDelegate > ) Delegate . CreateDelegate (
116116 typeof ( Func < ParseStringDelegate > ) , mi ) ;
117117 parseFn = parseFactoryFn ( ) ;
118-
118+
119119 Dictionary < Type , ParseStringDelegate > snapshot , newCache ;
120120 do
121121 {
@@ -126,63 +126,63 @@ public static ParseStringDelegate GetParseFn(Type type)
126126 } while ( ! ReferenceEquals (
127127 Interlocked . CompareExchange ( ref ParseDelegateCache , newCache , snapshot ) , snapshot ) ) ;
128128
129- return parseFn ;
130- }
131- }
132-
133- internal static class DeserializeArray < T , TSerializer >
134- where TSerializer : ITypeSerializer
135- {
136- private static readonly ITypeSerializer Serializer = JsWriter . GetTypeSerializer < TSerializer > ( ) ;
137-
138- private static readonly ParseStringDelegate CacheFn ;
139-
140- static DeserializeArray ( )
141- {
142- CacheFn = GetParseFn ( ) ;
143- }
144-
145- public static ParseStringDelegate Parse
146- {
147- get { return CacheFn ; }
148- }
149-
150- public static ParseStringDelegate GetParseFn ( )
151- {
152- var type = typeof ( T ) ;
153- if ( ! type . IsArray )
154- throw new ArgumentException ( string . Format ( "Type {0} is not an Array type" , type . FullName ) ) ;
155-
156- if ( type == typeof ( string [ ] ) )
157- return ParseStringArray ;
158- if ( type == typeof ( byte [ ] ) )
159- return ParseByteArray ;
160-
161- var elementType = type . GetElementType ( ) ;
162- var elementParseFn = Serializer . GetParseFn ( elementType ) ;
163- if ( elementParseFn != null )
164- {
165- var parseFn = DeserializeArrayWithElements < TSerializer > . GetParseFn ( elementType ) ;
166- return value => parseFn ( value , elementParseFn ) ;
167- }
168- return null ;
169- }
170-
171- public static string [ ] ParseStringArray ( string value )
172- {
173- if ( ( value = DeserializeListWithElements < TSerializer > . StripList ( value ) ) == null ) return null ;
174- return value == string . Empty
175- ? new string [ 0 ]
176- : DeserializeListWithElements < TSerializer > . ParseStringList ( value ) . ToArray ( ) ;
177- }
178-
179- public static byte [ ] ParseByteArray ( string value )
180- {
181- if ( ( value = DeserializeListWithElements < TSerializer > . StripList ( value ) ) == null ) return null ;
182- if ( ( value = Serializer . UnescapeSafeString ( value ) ) == null ) return null ;
183- return value == string . Empty
184- ? new byte [ 0 ]
185- : Convert . FromBase64String ( value ) ;
186- }
187- }
129+ return parseFn ;
130+ }
131+ }
132+
133+ internal static class DeserializeArray < T , TSerializer >
134+ where TSerializer : ITypeSerializer
135+ {
136+ private static readonly ITypeSerializer Serializer = JsWriter . GetTypeSerializer < TSerializer > ( ) ;
137+
138+ private static readonly ParseStringDelegate CacheFn ;
139+
140+ static DeserializeArray ( )
141+ {
142+ CacheFn = GetParseFn ( ) ;
143+ }
144+
145+ public static ParseStringDelegate Parse
146+ {
147+ get { return CacheFn ; }
148+ }
149+
150+ public static ParseStringDelegate GetParseFn ( )
151+ {
152+ var type = typeof ( T ) ;
153+ if ( ! type . IsArray )
154+ throw new ArgumentException ( string . Format ( "Type {0} is not an Array type" , type . FullName ) ) ;
155+
156+ if ( type == typeof ( string [ ] ) )
157+ return ParseStringArray ;
158+ if ( type == typeof ( byte [ ] ) )
159+ return ParseByteArray ;
160+
161+ var elementType = type . GetElementType ( ) ;
162+ var elementParseFn = Serializer . GetParseFn ( elementType ) ;
163+ if ( elementParseFn != null )
164+ {
165+ var parseFn = DeserializeArrayWithElements < TSerializer > . GetParseFn ( elementType ) ;
166+ return value => parseFn ( value , elementParseFn ) ;
167+ }
168+ return null ;
169+ }
170+
171+ public static string [ ] ParseStringArray ( string value )
172+ {
173+ if ( ( value = DeserializeListWithElements < TSerializer > . StripList ( value ) ) == null ) return null ;
174+ return value == string . Empty
175+ ? new string [ 0 ]
176+ : DeserializeListWithElements < TSerializer > . ParseStringList ( value ) . ToArray ( ) ;
177+ }
178+
179+ public static byte [ ] ParseByteArray ( string value )
180+ {
181+ if ( ( value = DeserializeListWithElements < TSerializer > . StripList ( value ) ) == null ) return null ;
182+ if ( ( value = Serializer . UnescapeSafeString ( value ) ) == null ) return null ;
183+ return value == string . Empty
184+ ? new byte [ 0 ]
185+ : Convert . FromBase64String ( value ) ;
186+ }
187+ }
188188}
0 commit comments