code: @Override
  	protected String serialize(InvocationContext context, Object input) {
  		
  		if(unavailable || incompatible) {
  			
  			throw new IllegalStateException(unavailable? ERROR_CONTEXT_UNAVAILABLE :ERROR_CONTEXT_INCOMPATIBLE);
  		}
  		
  		try {
  			
  			return input == null? null :(String) Gson_toJson.invoke(
  					gson, input, TypeToken_getType.invoke(TypeToken_GET.invoke(null, input.getClass())));
  		} 
  		catch(Exception e) {
  			
  			throw new SerializerException(new StringBuilder("JSON serialization failed for request <")
  			.append(context.getRequest().getName())
  			.append("> on endpoint <")
  			.append(context.getEndpoint().getName())
  			.append(">").toString(), e);
  		}
  	}
docs: <p>Serializes the given model using <b>GSON</b> and returns the resulting JSON string.</p>
  
  <p>See {@link AbstractSerializer#serialize(InvocationContext, Object)}.</p>
  
  @param context
  the {@link InvocationContext} to discover information on the proxy invocation
  <br><br>
  @param input
  the input model to be serialized to a JSON string
  <br><br>
  @return the JSON {@link String} which represents the provided input model, else {@code null} if the
  provided input was {@code null}
  <br><br>
  @throws IllegalStateException
  if the <b>GSON library</b> was not found on the classpath or if an incompatible version
  of the library is being used
  <br><br>
  @throws SerializerException
  if JSON serialization failed for the given entity using the Gson library
  <br><br>
  @since 1.3.0