@Override
  public RequestMessage deserializeRequest(final ByteBuf msg) throws SerializationException {
    try {
      final Kryo kryo = kryoThreadLocal.get();
      final byte[] payload = new byte[msg.readableBytes()];
      msg.readBytes(payload);
      try (final Input input = new Input(payload)) {
        // by the time the message gets here, the mime length/type have been already read, so this
        // part just
        // needs to process the payload.
        final UUID id = kryo.readObject(input, UUID.class);
        final String processor = input.readString();
        final String op = input.readString();

        final RequestMessage.Builder builder =
            RequestMessage.build(op).overrideRequestId(id).processor(processor);

        final Map<String, Object> args = kryo.readObject(input, HashMap.class);
        args.forEach(builder::addArg);
        return builder.create();
      }
    } catch (Exception ex) {
      logger.warn(
          "Request [{}] could not be deserialized by {}.",
          msg,
          GryoMessageSerializerV1d0.class.getName());
      throw new SerializationException(ex);
    }
  }