public void visitArrayField(FieldAttributes f, Type typeOfF, Object obj) {
   try {
     if (isFieldNull(f, obj)) {
       if (serializeNulls) {
         addChildAsElement(f, JsonNull.createJsonNull());
       }
     } else {
       Object array = getFieldValue(f, obj);
       addAsChildOfObject(f, new ObjectTypePair(array, typeOfF, false));
     }
   } catch (CircularReferenceException e) {
     throw e.createDetailedException(f);
   }
 }
 public void visitObjectField(FieldAttributes f, Type typeOfF, Object obj) {
   try {
     if (isFieldNull(f, obj)) {
       if (serializeNulls) {
         addChildAsElement(f, JsonNull.createJsonNull());
       }
     } else {
       Object fieldValue = getFieldValue(f, obj);
       // we should not get more specific component type yet since it is
       // possible that a custom
       // serializer is registered for the componentType
       addAsChildOfObject(f, new ObjectTypePair(fieldValue, typeOfF, false));
     }
   } catch (CircularReferenceException e) {
     throw e.createDetailedException(f);
   }
 }
 public boolean visitUsingCustomHandler(ObjectTypePair objTypePair) {
   try {
     Object obj = objTypePair.getObject();
     if (obj == null) {
       if (serializeNulls) {
         assignToRoot(JsonNull.createJsonNull());
       }
       return true;
     }
     JsonElement element = findAndInvokeCustomSerializer(objTypePair);
     if (element != null) {
       assignToRoot(element);
       return true;
     }
     return false;
   } catch (CircularReferenceException e) {
     throw e.createDetailedException(null);
   }
 }
 public boolean visitFieldUsingCustomHandler(
     FieldAttributes f, Type declaredTypeOfField, Object parent) {
   try {
     Preconditions.checkState(root.isJsonObject());
     Object obj = f.get(parent);
     if (obj == null) {
       if (serializeNulls) {
         addChildAsElement(f, JsonNull.createJsonNull());
       }
       return true;
     }
     ObjectTypePair objTypePair = new ObjectTypePair(obj, declaredTypeOfField, false);
     JsonElement child = findAndInvokeCustomSerializer(objTypePair);
     if (child != null) {
       addChildAsElement(f, child);
       return true;
     }
     return false;
   } catch (IllegalAccessException e) {
     throw new RuntimeException();
   } catch (CircularReferenceException e) {
     throw e.createDetailedException(f);
   }
 }