@@ -125,7 +125,10 @@ private static bool Init()
125
125
var propertyInfo = propertyInfos [ i ] ;
126
126
127
127
string propertyName , propertyNameCLSFriendly , propertyNameLowercaseUnderscore , propertyReflectedName ;
128
- int propertyOrder = 0 ;
128
+ int propertyOrder = - 1 ;
129
+ var propertyType = propertyInfo . PropertyType ;
130
+ bool suppressDefaultValue = ! propertyType . IsValueType ( ) || JsConfig . HasSerializeFn . Contains ( propertyType ) ;
131
+ bool suppressNullValue = propertyType . GetDefaultValue ( ) == null ;
129
132
130
133
if ( isDataContract )
131
134
{
@@ -137,6 +140,8 @@ private static bool Init()
137
140
propertyNameLowercaseUnderscore = dcsDataMember . Name ?? propertyName . ToLowercaseUnderscore ( ) ;
138
141
propertyReflectedName = dcsDataMember . Name ?? propertyInfo . ReflectedType . Name ;
139
142
propertyOrder = dcsDataMember . Order ;
143
+ suppressDefaultValue = ! dcsDataMember . EmitDefaultValue ;
144
+ suppressNullValue &= ! dcsDataMember . EmitDefaultValue ;
140
145
}
141
146
else
142
147
{
@@ -146,10 +151,6 @@ private static bool Init()
146
151
propertyReflectedName = propertyInfo . ReflectedType . Name ;
147
152
}
148
153
149
- var propertyType = propertyInfo . PropertyType ;
150
- var suppressDefaultValue = propertyType . IsValueType ( ) && JsConfig . HasSerializeFn . Contains ( propertyType )
151
- ? propertyType . GetDefaultValue ( )
152
- : null ;
153
154
154
155
PropertyWriters [ i ] = new TypePropertyWriter
155
156
(
@@ -158,9 +159,11 @@ private static bool Init()
158
159
propertyNameCLSFriendly ,
159
160
propertyNameLowercaseUnderscore ,
160
161
propertyOrder ,
162
+ suppressDefaultValue ,
163
+ suppressNullValue ,
161
164
propertyInfo . GetValueGetter < T > ( ) ,
162
165
Serializer . GetWriteFn ( propertyType ) ,
163
- suppressDefaultValue
166
+ propertyType . GetDefaultValue ( )
164
167
) ;
165
168
}
166
169
@@ -169,12 +172,10 @@ private static bool Init()
169
172
var fieldInfo = fieldInfos [ i ] ;
170
173
171
174
string propertyName , propertyNameCLSFriendly , propertyNameLowercaseUnderscore , propertyReflectedName ;
172
- int propertyOrder = 0 ;
173
-
175
+ int propertyOrder = - 1 ;
174
176
var propertyType = fieldInfo . FieldType ;
175
- var suppressDefaultValue = propertyType . IsValueType ( ) && JsConfig . HasSerializeFn . Contains ( propertyType )
176
- ? propertyType . GetDefaultValue ( )
177
- : null ;
177
+ bool suppressDefaultValue = ! propertyType . IsValueType ( ) || JsConfig . HasSerializeFn . Contains ( propertyType ) ;
178
+ bool suppressNullValue = propertyType . GetDefaultValue ( ) == null ;
178
179
179
180
if ( isDataContract )
180
181
{
@@ -186,6 +187,8 @@ private static bool Init()
186
187
propertyNameLowercaseUnderscore = dcsDataMember . Name ?? propertyName . ToLowercaseUnderscore ( ) ;
187
188
propertyReflectedName = dcsDataMember . Name ?? fieldInfo . ReflectedType . Name ;
188
189
propertyOrder = dcsDataMember . Order ;
190
+ suppressDefaultValue = ! dcsDataMember . EmitDefaultValue ;
191
+ suppressNullValue &= ! dcsDataMember . EmitDefaultValue ;
189
192
}
190
193
else
191
194
{
@@ -195,24 +198,21 @@ private static bool Init()
195
198
propertyReflectedName = fieldInfo . ReflectedType . Name ;
196
199
}
197
200
198
-
199
-
200
201
PropertyWriters [ i + propertyNamesLength ] = new TypePropertyWriter
201
202
(
202
203
propertyName ,
203
204
propertyReflectedName ,
204
205
propertyNameCLSFriendly ,
205
206
propertyNameLowercaseUnderscore ,
206
207
propertyOrder ,
208
+ suppressDefaultValue ,
209
+ suppressNullValue ,
207
210
fieldInfo . GetValueGetter < T > ( ) ,
208
211
Serializer . GetWriteFn ( propertyType ) ,
209
- suppressDefaultValue
212
+ propertyType . GetDefaultValue ( )
210
213
) ;
211
214
}
212
-
213
-
214
- PropertyWriters = PropertyWriters . OrderBy ( x => x . propertyOrder ) . ToArray ( ) ;
215
-
215
+ PropertyWriters = PropertyWriters . OrderBy ( x => x . propertyOrder ) . ToArray ( ) ;
216
216
return true ;
217
217
}
218
218
@@ -231,6 +231,8 @@ internal string PropertyName
231
231
}
232
232
internal readonly string propertyName ;
233
233
internal readonly int propertyOrder ;
234
+ internal readonly bool propertySuppressDefaultValue ;
235
+ internal readonly bool propertySuppressNullValue ;
234
236
internal readonly string propertyReflectedName ;
235
237
internal readonly string propertyCombinedNameUpper ;
236
238
internal readonly string propertyNameCLSFriendly ;
@@ -239,11 +241,13 @@ internal string PropertyName
239
241
internal readonly WriteObjectDelegate WriteFn ;
240
242
internal readonly object DefaultValue ;
241
243
242
- public TypePropertyWriter ( string propertyName , string propertyReflectedName , string propertyNameCLSFriendly , string propertyNameLowercaseUnderscore , int propertyOrder ,
244
+ public TypePropertyWriter ( string propertyName , string propertyReflectedName , string propertyNameCLSFriendly , string propertyNameLowercaseUnderscore , int propertyOrder , bool propertySuppressDefaultValue , bool propertySuppressNullValue ,
243
245
Func < T , object > getterFn , WriteObjectDelegate writeFn , object defaultValue )
244
246
{
245
247
this . propertyName = propertyName ;
246
248
this . propertyOrder = propertyOrder ;
249
+ this . propertySuppressDefaultValue = propertySuppressDefaultValue ;
250
+ this . propertySuppressNullValue = propertySuppressNullValue ;
247
251
this . propertyReflectedName = propertyReflectedName ;
248
252
this . propertyCombinedNameUpper = propertyReflectedName . ToUpper ( ) + "." + propertyName . ToUpper ( ) ;
249
253
this . propertyNameCLSFriendly = propertyNameCLSFriendly ;
@@ -320,10 +324,21 @@ public static void WriteProperties(TextWriter writer, object value)
320
324
var propertyValue = value != null
321
325
? propertyWriter . GetterFn ( ( T ) value )
322
326
: null ;
323
-
324
- if ( ( propertyValue == null
325
- || ( propertyWriter . DefaultValue != null && propertyWriter . DefaultValue . Equals ( propertyValue ) ) )
326
- && ! Serializer . IncludeNullValues ) continue ;
327
+
328
+ if ( propertyValue == null )
329
+ {
330
+ if ( propertyWriter . propertySuppressNullValue && ! Serializer . IncludeNullValues )
331
+ {
332
+ continue ;
333
+ }
334
+ }
335
+ else if ( propertyValue . Equals ( propertyWriter . DefaultValue ) )
336
+ {
337
+ if ( propertyWriter . propertySuppressDefaultValue && ! Serializer . IncludeNullValues )
338
+ {
339
+ continue ;
340
+ }
341
+ }
327
342
328
343
if ( exclude . Any ( ) && exclude . Contains ( propertyWriter . propertyCombinedNameUpper ) ) continue ;
329
344
0 commit comments