Skip to content

Commit 3711af5

Browse files
authored
Merge pull request #686 from jamezp/issue685
[685] Ensure the value type of a container being deserialized uses th…
2 parents 7448236 + 2439bca commit 3711af5

File tree

4 files changed

+455
-23
lines changed

4 files changed

+455
-23
lines changed

src/main/java/org/eclipse/yasson/internal/deserializer/DeserializationModelCreator.java

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -180,15 +180,15 @@ private ModelDeserializer<JsonParser> deserializerChainInternal(LinkedList<Type>
180180
return typeDeserializer;
181181
}
182182
if (Collection.class.isAssignableFrom(rawType)) {
183-
return createCollectionDeserializer(cachedItem, rawType, chain, propertyCustomization);
183+
return createCollectionDeserializer(cachedItem, rawType, chain);
184184
} else if (Map.class.isAssignableFrom(rawType)) {
185-
return createMapDeserializer(cachedItem, rawType, chain, propertyCustomization);
185+
return createMapDeserializer(cachedItem, rawType, chain);
186186
} else if (rawType.isArray()) {
187-
return createArrayDeserializer(cachedItem, rawType, chain, propertyCustomization);
187+
return createArrayDeserializer(cachedItem, rawType, chain);
188188
} else if (type instanceof GenericArrayType) {
189-
return createGenericArray(cachedItem, rawType, chain, propertyCustomization);
189+
return createGenericArray(cachedItem, rawType, chain);
190190
} else if (Optional.class.isAssignableFrom(rawType)) {
191-
return createOptionalDeserializer(chain, type, propertyCustomization, cachedItem);
191+
return createOptionalDeserializer(chain, type, cachedItem);
192192
} else {
193193
return createObjectDeserializer(chain, type, propertyCustomization, classModel, rawType, cachedItem);
194194
}
@@ -262,8 +262,7 @@ private ModelDeserializer<JsonParser> createObjectDeserializer(LinkedList<Type>
262262

263263
private ModelDeserializer<JsonParser> createCollectionDeserializer(CachedItem cachedItem,
264264
Class<?> rawType,
265-
LinkedList<Type> chain,
266-
Customization propertyCustomization) {
265+
LinkedList<Type> chain) {
267266
Type type = cachedItem.type;
268267
Type colType = type instanceof ParameterizedType
269268
? ((ParameterizedType) type).getActualTypeArguments()[0]
@@ -284,8 +283,7 @@ private ModelDeserializer<JsonParser> createCollectionDeserializer(CachedItem ca
284283

285284
private ModelDeserializer<JsonParser> createMapDeserializer(CachedItem cachedItem,
286285
Class<?> rawType,
287-
LinkedList<Type> chain,
288-
Customization propertyCustomization) {
286+
LinkedList<Type> chain) {
289287
Type type = cachedItem.type;
290288
Type keyType = type instanceof ParameterizedType
291289
? ((ParameterizedType) type).getActualTypeArguments()[0]
@@ -298,9 +296,10 @@ private ModelDeserializer<JsonParser> createMapDeserializer(CachedItem cachedIte
298296
ClassCustomization.empty(),
299297
JustReturn.instance(),
300298
MAP_KEY_EVENTS);
299+
ClassModel valueClassModel = jsonbContext.getMappingContext().getOrCreateClassModel(ReflectionUtils.resolveRawType(chain, valueType));
301300
ModelDeserializer<JsonParser> valueProcessor = typeProcessor(chain,
302301
valueType,
303-
propertyCustomization,
302+
valueClassModel.getClassCustomization(),
304303
JustReturn.instance());
305304

306305
MapDeserializer mapDeserializer = new MapDeserializer(keyProcessor, valueProcessor);
@@ -315,14 +314,15 @@ private ModelDeserializer<JsonParser> createMapDeserializer(CachedItem cachedIte
315314

316315
private ModelDeserializer<JsonParser> createArrayDeserializer(CachedItem cachedItem,
317316
Class<?> rawType,
318-
LinkedList<Type> chain,
319-
Customization propertyCustomization) {
317+
LinkedList<Type> chain) {
320318
JsonbConfigProperties configProperties = jsonbContext.getConfigProperties();
321319
if (rawType.equals(byte[].class) && !configProperties.getBinaryDataStrategy().equals(BinaryDataStrategy.BYTE)) {
322320
String strategy = configProperties.getBinaryDataStrategy();
321+
// Special case for byte[] with base64 encoding - use String's class customization
322+
ClassModel stringModel = jsonbContext.getMappingContext().getOrCreateClassModel(String.class);
323323
ModelDeserializer<JsonParser> typeProcessor = typeProcessor(chain,
324324
String.class,
325-
propertyCustomization,
325+
stringModel.getClassCustomization(),
326326
JustReturn.instance());
327327
ModelDeserializer<JsonParser> base64Deserializer = ArrayInstanceCreator.createBase64Deserializer(strategy,
328328
typeProcessor);
@@ -331,22 +331,23 @@ private ModelDeserializer<JsonParser> createArrayDeserializer(CachedItem cachedI
331331
return nullChecker;
332332
}
333333
Class<?> arrayType = rawType.getComponentType();
334+
ClassModel classModel = jsonbContext.getMappingContext().getOrCreateClassModel(arrayType);
334335
ModelDeserializer<JsonParser> typeProcessor = typeProcessor(chain,
335336
arrayType,
336-
propertyCustomization,
337+
classModel.getClassCustomization(),
337338
JustReturn.instance());
338339
return createArrayCommonDeserializer(cachedItem, rawType, arrayType, typeProcessor);
339340
}
340341

341342
private ModelDeserializer<JsonParser> createGenericArray(CachedItem cachedItem,
342343
Class<?> rawType,
343-
LinkedList<Type> chain,
344-
Customization propertyCustomization) {
344+
LinkedList<Type> chain) {
345345
GenericArrayType type = (GenericArrayType) cachedItem.type;
346346
Class<?> component = ReflectionUtils.getRawType(type.getGenericComponentType());
347+
ClassModel classModel = jsonbContext.getMappingContext().getOrCreateClassModel(component);
347348
ModelDeserializer<JsonParser> typeProcessor = typeProcessor(chain,
348349
type.getGenericComponentType(),
349-
propertyCustomization,
350+
classModel.getClassCustomization(),
350351
JustReturn.instance());
351352
return createArrayCommonDeserializer(cachedItem, rawType, component, typeProcessor);
352353
}
@@ -365,12 +366,13 @@ private ModelDeserializer<JsonParser> createArrayCommonDeserializer(CachedItem c
365366

366367
private OptionalDeserializer createOptionalDeserializer(LinkedList<Type> chain,
367368
Type type,
368-
Customization propertyCustomization,
369369
CachedItem cachedItem) {
370370
Type colType = type instanceof ParameterizedType
371371
? ((ParameterizedType) type).getActualTypeArguments()[0]
372372
: Object.class;
373-
ModelDeserializer<JsonParser> typeProcessor = typeProcessor(chain, colType, propertyCustomization, JustReturn.instance());
373+
colType = ReflectionUtils.resolveType(chain, colType);
374+
ClassModel classModel = jsonbContext.getMappingContext().getOrCreateClassModel(ReflectionUtils.getRawType(colType));
375+
ModelDeserializer<JsonParser> typeProcessor = typeProcessor(chain, colType, classModel.getClassCustomization(), JustReturn.instance());
374376
OptionalDeserializer optionalDeserializer = new OptionalDeserializer(typeProcessor, JustReturn.instance());
375377
models.put(cachedItem, optionalDeserializer);
376378
return optionalDeserializer;

src/main/java/org/eclipse/yasson/internal/serializer/SerializationModelCreator.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,9 @@ private ModelSerializer createMapSerializer(LinkedList<Type> chain, Type type, C
302302
Type resolvedKey = ReflectionUtils.resolveType(chain, keyType);
303303
Class<?> rawClass = ReflectionUtils.getRawType(resolvedKey);
304304
ModelSerializer keySerializer = memberSerializer(chain, keyType, ClassCustomization.empty(), true);
305-
ModelSerializer valueSerializer = memberSerializer(chain, valueType, propertyCustomization, false);
305+
Type resolvedValue = ReflectionUtils.resolveType(chain, valueType);
306+
ClassModel valueClassModel = jsonbContext.getMappingContext().getOrCreateClassModel(ReflectionUtils.getRawType(resolvedValue));
307+
ModelSerializer valueSerializer = memberSerializer(chain, valueType, valueClassModel.getClassCustomization(), false);
306308
MapSerializer mapSerializer = MapSerializer.create(rawClass, keySerializer, valueSerializer, jsonbContext);
307309
KeyWriter keyWriter = new KeyWriter(mapSerializer);
308310
NullVisibilitySwitcher nullVisibilitySwitcher = new NullVisibilitySwitcher(true, keyWriter);
@@ -313,7 +315,8 @@ private ModelSerializer createArraySerializer(LinkedList<Type> chain,
313315
Class<?> raw,
314316
Customization propertyCustomization) {
315317
Class<?> arrayComponent = raw.getComponentType();
316-
ModelSerializer modelSerializer = memberSerializer(chain, arrayComponent, propertyCustomization, false);
318+
ClassModel classModel = jsonbContext.getMappingContext().getOrCreateClassModel(arrayComponent);
319+
ModelSerializer modelSerializer = memberSerializer(chain, arrayComponent, classModel.getClassCustomization(), false);
317320
ModelSerializer arraySerializer = ArraySerializer.create(raw, jsonbContext, modelSerializer);
318321
KeyWriter keyWriter = new KeyWriter(arraySerializer);
319322
NullVisibilitySwitcher nullVisibilitySwitcher = new NullVisibilitySwitcher(true, keyWriter);
@@ -325,7 +328,8 @@ private ModelSerializer createGenericArraySerializer(LinkedList<Type> chain,
325328
Customization propertyCustomization) {
326329
Class<?> raw = ReflectionUtils.getRawType(type);
327330
Class<?> component = ReflectionUtils.getRawType(((GenericArrayType) type).getGenericComponentType());
328-
ModelSerializer modelSerializer = memberSerializer(chain, component, propertyCustomization, false);
331+
ClassModel classModel = jsonbContext.getMappingContext().getOrCreateClassModel(component);
332+
ModelSerializer modelSerializer = memberSerializer(chain, component, classModel.getClassCustomization(), false);
329333
ModelSerializer arraySerializer = ArraySerializer.create(raw, jsonbContext, modelSerializer);
330334
KeyWriter keyWriter = new KeyWriter(arraySerializer);
331335
NullVisibilitySwitcher nullVisibilitySwitcher = new NullVisibilitySwitcher(true, keyWriter);
@@ -339,7 +343,9 @@ private ModelSerializer createOptionalSerializer(LinkedList<Type> chain,
339343
Type optType = type instanceof ParameterizedType
340344
? ((ParameterizedType) type).getActualTypeArguments()[0]
341345
: Object.class;
342-
ModelSerializer modelSerializer = memberSerializer(chain, optType, propertyCustomization, isKey);
346+
Type resolvedOptType = ReflectionUtils.resolveType(chain, optType);
347+
ClassModel classModel = jsonbContext.getMappingContext().getOrCreateClassModel(ReflectionUtils.getRawType(resolvedOptType));
348+
ModelSerializer modelSerializer = memberSerializer(chain, optType, classModel.getClassCustomization(), isKey);
343349
return new OptionalSerializer(modelSerializer);
344350
}
345351

0 commit comments

Comments
 (0)