private long readJavaChunkGeneric()

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;
  }