docs: public static String serializeObject(final Object obj, final int indentWidth,
              final boolean onlySerializePublicFields, final ClassFieldCache classFieldCache) {
          final HashMap<ReferenceEqualityKey<Object>, JSONObject> objToJSONVal = new HashMap<>();
  
          final Object rootJsonVal = toJSONGraph(obj, new HashSet<ReferenceEqualityKey<Object>>(),
                  new HashSet<ReferenceEqualityKey<Object>>(), classFieldCache, objToJSONVal,
                  onlySerializePublicFields);
  
          final Map<ReferenceEqualityKey<JSONReference>, CharSequence> jsonReferenceToId = new HashMap<>();
          final AtomicInteger objId = new AtomicInteger(0);
          assignObjectIds(rootJsonVal, objToJSONVal, classFieldCache, jsonReferenceToId, objId,
                  onlySerializePublicFields);
  
          final StringBuilder buf = new StringBuilder(32768);
          jsonValToJSONString(rootJsonVal, jsonReferenceToId, /* includeNullValuedFields = */ false, 0, indentWidth,
                  buf);
          return buf.toString();
      }