@@ -30,9 +30,10 @@ public static ClassDescriptor getDecodingClassDescriptor(ClassInfo classInfo, bo
30
30
desc .clazz = clazz ;
31
31
desc .lookup = lookup ;
32
32
desc .ctor = getCtor (clazz );
33
- desc . fields = getFields (lookup , classInfo , includingPrivate );
34
- desc .setters = getSetters (lookup , classInfo , includingPrivate );
33
+ Map < String , Binding > allFields = getFields (lookup , classInfo , includingPrivate );
34
+ desc .setters = getSetters (lookup , classInfo , includingPrivate , allFields );
35
35
desc .getters = new ArrayList <Binding >();
36
+ desc .fields = omitTransient (allFields );
36
37
desc .bindingTypeWrappers = new ArrayList <WrapperDescriptor >();
37
38
desc .keyValueTypeWrappers = new ArrayList <Method >();
38
39
desc .unwrappers = new ArrayList <UnwrapperDescriptor >();
@@ -85,8 +86,9 @@ public static ClassDescriptor getEncodingClassDescriptor(ClassInfo classInfo, bo
85
86
desc .classInfo = classInfo ;
86
87
desc .clazz = clazz ;
87
88
desc .lookup = lookup ;
88
- desc .fields = getFields (lookup , classInfo , includingPrivate );
89
- desc .getters = getGetters (lookup , classInfo , includingPrivate );
89
+ Map <String , Binding > allFields = getFields (lookup , classInfo , includingPrivate );
90
+ desc .getters = getGetters (lookup , classInfo , includingPrivate , allFields );
91
+ desc .fields = omitTransient (allFields );
90
92
desc .bindingTypeWrappers = new ArrayList <WrapperDescriptor >();
91
93
desc .keyValueTypeWrappers = new ArrayList <Method >();
92
94
desc .unwrappers = new ArrayList <UnwrapperDescriptor >();
@@ -111,6 +113,16 @@ public static ClassDescriptor getEncodingClassDescriptor(ClassInfo classInfo, bo
111
113
return desc ;
112
114
}
113
115
116
+ private static List <Binding > omitTransient (Map <String , Binding > map ) {
117
+ List <Binding > out = new ArrayList <Binding >();
118
+ for (Binding binding : map .values ()) {
119
+ if (!binding .isTransient ) {
120
+ out .add (binding );
121
+ }
122
+ }
123
+ return out ;
124
+ }
125
+
114
126
private static void decodingDeduplicate (ClassDescriptor desc ) {
115
127
HashMap <String , Binding > byName = new HashMap <String , Binding >();
116
128
for (Binding field : desc .fields ) {
@@ -223,35 +235,33 @@ private static ConstructorDescriptor getCtor(Class clazz) {
223
235
return cctor ;
224
236
}
225
237
226
- private static List < Binding > getFields (Map <String , Type > lookup , ClassInfo classInfo , boolean includingPrivate ) {
227
- ArrayList < Binding > bindings = new ArrayList < Binding >();
238
+ private static Map < String , Binding > getFields (Map <String , Type > lookup , ClassInfo classInfo , boolean includingPrivate ) {
239
+ Map < String , Binding > output = new LinkedHashMap < String , Binding >();// To ensure fields order
228
240
for (Field field : getAllFields (classInfo .clazz , includingPrivate )) {
229
241
if (Modifier .isStatic (field .getModifiers ())) {
230
242
continue ;
231
243
}
232
- if (Modifier .isTransient (field .getModifiers ())) {
233
- continue ;
234
- }
235
244
if (!includingPrivate && !Modifier .isPublic (field .getType ().getModifiers ())) {
236
245
continue ;
237
246
}
238
247
if (includingPrivate ) {
239
248
field .setAccessible (true );
240
249
}
241
- Binding binding = createBindingFromField (lookup , classInfo , field );
242
- bindings . add ( binding );
250
+ Binding binding = createBindingFromField (lookup , classInfo , field , Modifier . isTransient ( field . getModifiers ()) );
251
+ output . put ( binding . name , binding );
243
252
}
244
- return bindings ;
253
+ return output ;
245
254
}
246
255
247
- private static Binding createBindingFromField (Map <String , Type > lookup , ClassInfo classInfo , Field field ) {
256
+ private static Binding createBindingFromField (Map <String , Type > lookup , ClassInfo classInfo , Field field , boolean isTransient ) {
248
257
try {
249
258
Binding binding = new Binding (classInfo , lookup , field .getGenericType ());
250
259
binding .fromNames = new String []{field .getName ()};
251
260
binding .toNames = new String []{field .getName ()};
252
261
binding .name = field .getName ();
253
262
binding .annotations = field .getAnnotations ();
254
263
binding .field = field ;
264
+ binding .isTransient = isTransient ;
255
265
return binding ;
256
266
} catch (Exception e ) {
257
267
throw new JsonException ("failed to create binding for field: " + field , e );
@@ -271,7 +281,7 @@ private static List<Field> getAllFields(Class clazz, boolean includingPrivate) {
271
281
return allFields ;
272
282
}
273
283
274
- private static List <Binding > getSetters (Map <String , Type > lookup , ClassInfo classInfo , boolean includingPrivate ) {
284
+ private static List <Binding > getSetters (Map <String , Type > lookup , ClassInfo classInfo , boolean includingPrivate , Map < String , Binding > allFields ) {
275
285
ArrayList <Binding > setters = new ArrayList <Binding >();
276
286
for (Method method : getAllMethods (classInfo .clazz , includingPrivate )) {
277
287
if (Modifier .isStatic (method .getModifiers ())) {
@@ -296,12 +306,16 @@ private static List<Binding> getSetters(Map<String, Type> lookup, ClassInfo clas
296
306
}
297
307
try {
298
308
String fromName = translateSetterName (methodName );
299
- Binding binding = new Binding (classInfo , lookup , paramTypes [0 ]);
300
- binding .fromNames = new String []{fromName };
301
- binding .name = fromName ;
302
- binding .method = method ;
303
- binding .annotations = method .getAnnotations ();
304
- setters .add (binding );
309
+ Binding field = allFields .get (fromName );
310
+ if (!(field == null ) && field .isTransient ) {
311
+ continue ;
312
+ }
313
+ Binding setter = new Binding (classInfo , lookup , paramTypes [0 ]);
314
+ setter .fromNames = new String []{fromName };
315
+ setter .name = fromName ;
316
+ setter .method = method ;
317
+ setter .annotations = method .getAnnotations ();
318
+ setters .add (setter );
305
319
} catch (Exception e ) {
306
320
throw new JsonException ("failed to create binding from setter: " + method , e );
307
321
}
@@ -333,7 +347,7 @@ private static String translateSetterName(String methodName) {
333
347
return fromName ;
334
348
}
335
349
336
- private static List <Binding > getGetters (Map <String , Type > lookup , ClassInfo classInfo , boolean includingPrivate ) {
350
+ private static List <Binding > getGetters (Map <String , Type > lookup , ClassInfo classInfo , boolean includingPrivate , Map < String , Binding > allFields ) {
337
351
ArrayList <Binding > getters = new ArrayList <Binding >();
338
352
for (Method method : getAllMethods (classInfo .clazz , includingPrivate )) {
339
353
if (Modifier .isStatic (method .getModifiers ())) {
@@ -356,6 +370,10 @@ private static List<Binding> getGetters(Map<String, Type> lookup, ClassInfo clas
356
370
char [] fromNameChars = toName .toCharArray ();
357
371
fromNameChars [0 ] = Character .toLowerCase (fromNameChars [0 ]);
358
372
toName = new String (fromNameChars );
373
+ Binding field = allFields .get (toName );
374
+ if (!(field == null ) && field .isTransient ) {
375
+ continue ;
376
+ }
359
377
Binding getter = new Binding (classInfo , lookup , method .getGenericReturnType ());
360
378
getter .toNames = new String []{toName };
361
379
getter .name = toName ;
0 commit comments