docs: public String keyToString(Object key) {
        // This string should be in the format of:
        // "<TYPE>:<KEY>" for internally supported types or "T:<KEY_CLASS>:<KEY>" for custom types
        // e.g.:
        //   "S:my string key"
        //   "I:75"
        //   "D:5.34"
        //   "B:f"
        //   "T:com.myorg.MyType:STRING_GENERATED_BY_TRANSFORMER_FOR_MY_TYPE"
  
        // First going to check if the key is a primitive or a String. Otherwise, check if it's a transformable.
        // If none of those conditions are satisfied, we'll throw a CacheException.
  
        // Using 'X' for Shorts and 'Y' for Bytes because 'S' is used for Strings and 'B' is being used for Booleans.
        if (key instanceof byte[])
           return "A:" + Base64.getEncoder().encodeToString((byte[]) key);  //todo [anistor] need to profile Base64 versus simple hex encoding of the raw bytes
        if (key instanceof String)
           return "S:" + key;
        else if (key instanceof Integer)
           return "I:" + key;
        else if (key instanceof Boolean)
           return "B:" + key;
        else if (key instanceof Long)
           return "L:" + key;
        else if (key instanceof Float)
           return "F:" + key;
        else if (key instanceof Double)
           return "D:" + key;
        else if (key instanceof Short)
           return "X:" + key;
        else if (key instanceof Byte)
           return "Y:" + key;
        else if (key instanceof Character)
           return "C:" + key;
        else if (key instanceof UUID)
           return "U:" + key;
        else {
           Transformer t = getTransformer(key.getClass());
           if (t != null) {
              return "T:" + key.getClass().getName() + ":" + t.toString(key);
           } else {
              throw log.noTransformerForKey(key.getClass().getName());
           }
        }
     }