in java/fury-core/src/main/java/org/apache/fury/serializer/collection/AbstractMapSerializer.java [716:788]
private long readJavaChunkGeneric(
Fury fury,
Generics generics,
GenericType genericType,
MemoryBuffer buffer,
Map map,
long size,
int chunkHeader) {
// type parameters count for `Map field` will be 0;
// type parameters count for `SubMap<V> field` which SubMap is
// `SubMap<V> implements Map<String, V>` will be 1;
if (genericType.getTypeParametersCount() < 2) {
genericType = getKVGenericType(genericType);
}
GenericType keyGenericType = genericType.getTypeParameter0();
GenericType valueGenericType = genericType.getTypeParameter1();
// noinspection Duplicates
boolean trackKeyRef = (chunkHeader & TRACKING_KEY_REF) != 0;
boolean trackValueRef = (chunkHeader & TRACKING_VALUE_REF) != 0;
boolean keyIsDeclaredType = (chunkHeader & KEY_DECL_TYPE) != 0;
boolean valueIsDeclaredType = (chunkHeader & VALUE_DECL_TYPE) != 0;
int chunkSize = buffer.readUnsignedByte();
Serializer keySerializer, valueSerializer;
if (!keyIsDeclaredType) {
keySerializer = typeResolver.readClassInfo(buffer, keyClassInfoReadCache).getSerializer();
} else {
keySerializer = keyGenericType.getSerializer(typeResolver);
}
if (!valueIsDeclaredType) {
valueSerializer = typeResolver.readClassInfo(buffer, valueClassInfoReadCache).getSerializer();
} else {
valueSerializer = valueGenericType.getSerializer(typeResolver);
}
if (keyGenericType.hasGenericParameters() || valueGenericType.hasGenericParameters()) {
for (int i = 0; i < chunkSize; i++) {
generics.pushGenericType(keyGenericType);
fury.incDepth(1);
Object key =
trackKeyRef
? binding.readRef(buffer, keySerializer)
: binding.read(buffer, keySerializer);
fury.incDepth(-1);
generics.popGenericType();
generics.pushGenericType(valueGenericType);
fury.incDepth(1);
Object value =
trackValueRef
? binding.readRef(buffer, valueSerializer)
: binding.read(buffer, valueSerializer);
fury.incDepth(-1);
generics.popGenericType();
map.put(key, value);
size--;
}
} else {
for (int i = 0; i < chunkSize; i++) {
// increase depth to avoid read wrong outer generic type
fury.incDepth(1);
Object key =
trackKeyRef
? binding.readRef(buffer, keySerializer)
: binding.read(buffer, keySerializer);
Object value =
trackValueRef
? binding.readRef(buffer, valueSerializer)
: binding.read(buffer, valueSerializer);
fury.incDepth(-1);
map.put(key, value);
size--;
}
}
return size > 0 ? (size << 8) | buffer.readUnsignedByte() : 0;
}