@Override
  @SuppressWarnings({"rawtypes", "unchecked"})
  public <V> V unmarshall(
      Class<?> type, DataInput dataInput, SerializationContext serializationContext)
      throws IOException {
    if (isNull(dataInput)) {
      return null;
    }

    int size = dataInput.readInt();
    Map map = new LinkedHashMap(size);
    if (size > 0) {
      for (int i = 0; i < size; i++) {
        Object key = null;
        if (!isNull(dataInput)) {
          long keyClassId = dataInput.readLong();
          ClassDefinition keyClassDefinition =
              serializationContext.getClassDefinitionContainer().getClassDefinitionById(keyClassId);

          Marshaller keyMarshaller;
          if (mapKeyType != null) {
            ensureMarshallersInitialized(serializationContext);
            keyMarshaller = mapKeyTypeMarshaller;
          } else {
            keyMarshaller = serializationContext.findMarshaller(keyClassDefinition.getType());
          }

          key =
              keyMarshaller.unmarshall(
                  keyClassDefinition.getType(), dataInput, serializationContext);
        }

        Object value = null;
        if (!isNull(dataInput)) {
          long valueClassId = dataInput.readLong();
          ClassDefinition valueClassDefinition =
              serializationContext
                  .getClassDefinitionContainer()
                  .getClassDefinitionById(valueClassId);

          Marshaller valueMarshaller;
          if (mapKeyType != null) {
            ensureMarshallersInitialized(serializationContext);
            valueMarshaller = mapValueTypeMarshaller;
          } else {
            valueMarshaller = serializationContext.findMarshaller(valueClassDefinition.getType());
          }

          value =
              valueMarshaller.unmarshall(
                  valueClassDefinition.getType(), dataInput, serializationContext);
        }

        map.put(key, value);
      }
    }

    return (V) map;
  }