@@ -50,49 +50,101 @@ public static object DeserializeFromReader(TextReader reader, Type type)
50
50
return DeserializeFromString ( reader . ReadToEnd ( ) , type ) ;
51
51
}
52
52
53
- public static string SerializeToString < T > ( T value )
53
+ [ ThreadStatic ] //Reuse the thread static StringBuilder when serializing to strings
54
+ private static StringBuilderWriter LastWriter ;
55
+
56
+ internal class StringBuilderWriter : IDisposable
57
+ {
58
+ protected StringBuilder sb ;
59
+ protected StringWriter writer ;
60
+
61
+ public StringWriter Writer
62
+ {
63
+ get { return writer ; }
64
+ }
65
+
66
+ public StringBuilderWriter ( )
67
+ {
68
+ this . sb = new StringBuilder ( ) ;
69
+ this . writer = new StringWriter ( sb , CultureInfo . InvariantCulture ) ;
70
+ }
71
+
72
+ public static StringBuilderWriter Create ( )
73
+ {
74
+ var ret = LastWriter ;
75
+ if ( JsConfig . ReuseStringBuffer && ret != null )
76
+ {
77
+ LastWriter = null ;
78
+ ret . sb . Clear ( ) ;
79
+ return ret ;
80
+ }
81
+
82
+ return new StringBuilderWriter ( ) ;
83
+ }
84
+
85
+ public override string ToString ( )
86
+ {
87
+ return sb . ToString ( ) ;
88
+ }
89
+
90
+ public void Dispose ( )
91
+ {
92
+ if ( JsConfig . ReuseStringBuffer )
93
+ {
94
+ LastWriter = this ;
95
+ }
96
+ else
97
+ {
98
+ Writer . Dispose ( ) ;
99
+ }
100
+ }
101
+ }
102
+
103
+ public static string SerializeToString < T > ( T value )
54
104
{
55
105
if ( value == null || value is Delegate ) return null ;
56
- if ( typeof ( T ) == typeof ( object ) || typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) )
106
+ if ( typeof ( T ) == typeof ( object ) )
107
+ {
108
+ return SerializeToString ( value , value . GetType ( ) ) ;
109
+ }
110
+ if ( typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) )
57
111
{
58
- if ( typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) ) JsState . IsWritingDynamic = true ;
112
+ JsState . IsWritingDynamic = true ;
59
113
var result = SerializeToString ( value , value . GetType ( ) ) ;
60
- if ( typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) ) JsState . IsWritingDynamic = false ;
114
+ JsState . IsWritingDynamic = false ;
61
115
return result ;
62
116
}
63
117
64
- var sb = new StringBuilder ( ) ;
65
- using ( var writer = new StringWriter ( sb , CultureInfo . InvariantCulture ) )
118
+ using ( var sb = StringBuilderWriter . Create ( ) )
66
119
{
67
120
if ( typeof ( T ) == typeof ( string ) )
68
121
{
69
- JsonUtils . WriteString ( writer , value as string ) ;
122
+ JsonUtils . WriteString ( sb . Writer , value as string ) ;
70
123
}
71
124
else
72
125
{
73
- JsonWriter < T > . WriteRootObject ( writer , value ) ;
126
+ JsonWriter < T > . WriteRootObject ( sb . Writer , value ) ;
74
127
}
128
+ return sb . ToString ( ) ;
75
129
}
76
- return sb . ToString ( ) ;
77
130
}
78
131
79
132
public static string SerializeToString ( object value , Type type )
80
133
{
81
134
if ( value == null ) return null ;
82
135
83
- var sb = new StringBuilder ( ) ;
84
- using ( var writer = new StringWriter ( sb , CultureInfo . InvariantCulture ) )
85
- {
136
+ using ( var sb = StringBuilderWriter . Create ( ) )
137
+ {
86
138
if ( type == typeof ( string ) )
87
139
{
88
- JsonUtils . WriteString ( writer , value as string ) ;
140
+ JsonUtils . WriteString ( sb . Writer , value as string ) ;
89
141
}
90
142
else
91
143
{
92
- JsonWriter . GetWriteFn ( type ) ( writer , value ) ;
144
+ JsonWriter . GetWriteFn ( type ) ( sb . Writer , value ) ;
93
145
}
94
- }
95
- return sb . ToString ( ) ;
146
+ return sb . ToString ( ) ;
147
+ }
96
148
}
97
149
98
150
public static void SerializeToWriter < T > ( T value , TextWriter writer )
@@ -101,17 +153,21 @@ public static void SerializeToWriter<T>(T value, TextWriter writer)
101
153
if ( typeof ( T ) == typeof ( string ) )
102
154
{
103
155
writer . Write ( value ) ;
104
- return ;
105
156
}
106
- if ( typeof ( T ) == typeof ( object ) || typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) )
157
+ else if ( typeof ( T ) == typeof ( object ) )
107
158
{
108
- if ( typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) ) JsState . IsWritingDynamic = true ;
109
159
SerializeToWriter ( value , value . GetType ( ) , writer ) ;
110
- if ( typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) ) JsState . IsWritingDynamic = false ;
111
- return ;
112
160
}
113
-
114
- JsonWriter < T > . WriteRootObject ( writer , value ) ;
161
+ else if ( typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) )
162
+ {
163
+ JsState . IsWritingDynamic = false ;
164
+ SerializeToWriter ( value , value . GetType ( ) , writer ) ;
165
+ JsState . IsWritingDynamic = true ;
166
+ }
167
+ else
168
+ {
169
+ JsonWriter < T > . WriteRootObject ( writer , value ) ;
170
+ }
115
171
}
116
172
117
173
public static void SerializeToWriter ( object value , Type type , TextWriter writer )
@@ -129,17 +185,22 @@ public static void SerializeToWriter(object value, Type type, TextWriter writer)
129
185
public static void SerializeToStream < T > ( T value , Stream stream )
130
186
{
131
187
if ( value == null ) return ;
132
- if ( typeof ( T ) == typeof ( object ) || typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) )
188
+ if ( typeof ( T ) == typeof ( object ) )
133
189
{
134
- if ( typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) ) JsState . IsWritingDynamic = true ;
135
190
SerializeToStream ( value , value . GetType ( ) , stream ) ;
136
- if ( typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) ) JsState . IsWritingDynamic = false ;
137
- return ;
138
191
}
139
-
140
- var writer = new StreamWriter ( stream , UTF8EncodingWithoutBom ) ;
141
- JsonWriter < T > . WriteRootObject ( writer , value ) ;
142
- writer . Flush ( ) ;
192
+ else if ( typeof ( T ) . IsAbstract ( ) || typeof ( T ) . IsInterface ( ) )
193
+ {
194
+ JsState . IsWritingDynamic = false ;
195
+ SerializeToStream ( value , value . GetType ( ) , stream ) ;
196
+ JsState . IsWritingDynamic = true ;
197
+ }
198
+ else
199
+ {
200
+ var writer = new StreamWriter ( stream , UTF8EncodingWithoutBom ) ;
201
+ JsonWriter < T > . WriteRootObject ( writer , value ) ;
202
+ writer . Flush ( ) ;
203
+ }
143
204
}
144
205
145
206
public static void SerializeToStream ( object value , Type type , Stream stream )
0 commit comments