docs: private <K, N, S extends State, V> CompletableFuture<S> getKvState(
  			final JobID jobId,
  			final String queryableStateName,
  			final K key,
  			final N namespace,
  			final TypeInformation<K> keyTypeInfo,
  			final TypeInformation<N> namespaceTypeInfo,
  			final StateDescriptor<S, V> stateDescriptor) {
  
  		Preconditions.checkNotNull(jobId);
  		Preconditions.checkNotNull(queryableStateName);
  		Preconditions.checkNotNull(key);
  		Preconditions.checkNotNull(namespace);
  
  		Preconditions.checkNotNull(keyTypeInfo);
  		Preconditions.checkNotNull(namespaceTypeInfo);
  		Preconditions.checkNotNull(stateDescriptor);
  
  		TypeSerializer<K> keySerializer = keyTypeInfo.createSerializer(executionConfig);
  		TypeSerializer<N> namespaceSerializer = namespaceTypeInfo.createSerializer(executionConfig);
  
  		stateDescriptor.initializeSerializerUnlessSet(executionConfig);
  
  		final byte[] serializedKeyAndNamespace;
  		try {
  			serializedKeyAndNamespace = KvStateSerializer
  					.serializeKeyAndNamespace(key, keySerializer, namespace, namespaceSerializer);
  		} catch (IOException e) {
  			return FutureUtils.getFailedFuture(e);
  		}
  
  		return getKvState(jobId, queryableStateName, key.hashCode(), serializedKeyAndNamespace)
  			.thenApply(stateResponse -> createState(stateResponse, stateDescriptor));
  	}