/** objTypePair.getObject() must not be null */ @SuppressWarnings({"unchecked", "rawtypes"}) private JsonElement findAndInvokeCustomSerializer(ObjectTypePair objTypePair) { Pair<JsonSerializer<?>, ObjectTypePair> pair = objTypePair.getMatchingHandler(serializers); if (pair == null) { return null; } JsonSerializer serializer = pair.first; objTypePair = pair.second; start(objTypePair); try { JsonElement element = serializer.serialize(objTypePair.getObject(), objTypePair.getType(), context); return element == null ? JsonNull.createJsonNull() : element; } finally { end(objTypePair); } }
private void addAsArrayElement(ObjectTypePair elementTypePair) { if (elementTypePair.getObject() == null) { root.getAsJsonArray().add(JsonNull.createJsonNull()); } else { JsonElement childElement = getJsonElementForChild(elementTypePair); root.getAsJsonArray().add(childElement); } }
/** * Navigate all the fields of the specified object. If a field is null, it does not get visited. */ public void accept(Visitor visitor) { TypeInfo objTypeInfo = new TypeInfo(objTypePair.type); if (exclusionStrategy.shouldSkipClass(objTypeInfo.getRawClass())) { return; } boolean visitedWithCustomHandler = visitor.visitUsingCustomHandler(objTypePair); if (!visitedWithCustomHandler) { Object obj = objTypePair.getObject(); Object objectToVisit = (obj == null) ? visitor.getTarget() : obj; if (objectToVisit == null) { return; } objTypePair.setObject(objectToVisit); visitor.start(objTypePair); try { if (objTypeInfo.isArray()) { visitor.visitArray(objectToVisit, objTypePair.type); } else if (objTypeInfo.getActualType() == Object.class && isPrimitiveOrString(objectToVisit)) { // TODO(Joel): this is only used for deserialization of "primitives" // we should rethink this!!! visitor.visitPrimitive(objectToVisit); objectToVisit = visitor.getTarget(); } else { visitor.startVisitingObject(objectToVisit); ObjectTypePair currObjTypePair = objTypePair.toMoreSpecificType(); Class<?> topLevelClass = new TypeInfo(currObjTypePair.type).getRawClass(); for (Class<?> curr = topLevelClass; curr != null && !curr.equals(Object.class); curr = curr.getSuperclass()) { if (!curr.isSynthetic()) { navigateClassFields(objectToVisit, curr, visitor); } } } } finally { visitor.end(objTypePair); } } }
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); } }