Made ObjectNavigator a reusable object. We now use just one instance of ObjectNavigator instead of creating one for each field/object.

This commit is contained in:
Inderjeet Singh 2011-03-24 18:41:45 +00:00
parent b819307de8
commit 13dc7b6f02
7 changed files with 27 additions and 22 deletions

View File

@ -60,8 +60,8 @@ final class JsonDeserializationContextDefault implements JsonDeserializationCont
JsonDeserializationContext context) throws JsonParseException {
JsonArrayDeserializationVisitor<T> visitor = new JsonArrayDeserializationVisitor<T>(
jsonArray, arrayType, navigatorFactory, objectConstructor, deserializers, context);
ObjectNavigator on = navigatorFactory.create(new ObjectTypePair(null, arrayType, true));
on.accept(visitor);
ObjectNavigator on = navigatorFactory.create();
on.accept(new ObjectTypePair(null, arrayType, true), visitor);
return visitor.getTarget();
}
@ -69,8 +69,8 @@ final class JsonDeserializationContextDefault implements JsonDeserializationCont
JsonDeserializationContext context) throws JsonParseException {
JsonObjectDeserializationVisitor<T> visitor = new JsonObjectDeserializationVisitor<T>(
jsonObject, typeOfT, navigatorFactory, objectConstructor, deserializers, context);
ObjectNavigator on = navigatorFactory.create(new ObjectTypePair(null, typeOfT, true));
on.accept(visitor);
ObjectNavigator on = navigatorFactory.create();
on.accept(new ObjectTypePair(null, typeOfT, true), visitor);
return visitor.getTarget();
}
@ -79,9 +79,8 @@ final class JsonDeserializationContextDefault implements JsonDeserializationCont
JsonDeserializationContext context) throws JsonParseException {
JsonObjectDeserializationVisitor<T> visitor = new JsonObjectDeserializationVisitor<T>(
json, typeOfT, navigatorFactory, objectConstructor, deserializers, context);
ObjectNavigator on =
navigatorFactory.create(new ObjectTypePair(json.getAsObject(), typeOfT, true));
on.accept(visitor);
ObjectNavigator on = navigatorFactory.create();
on.accept(new ObjectTypePair(json.getAsObject(), typeOfT, true), visitor);
Object target = visitor.getTarget();
return (T) target;
}

View File

@ -105,8 +105,8 @@ abstract class JsonDeserializationVisitor<T> implements ObjectNavigator.Visitor
}
private Object visitChild(Type type, JsonDeserializationVisitor<?> childVisitor) {
ObjectNavigator on = factory.create(new ObjectTypePair(null, type, false));
on.accept(childVisitor);
ObjectNavigator on = factory.create();
on.accept(new ObjectTypePair(null, type, false), childVisitor);
// the underlying object may have changed during the construction phase
// This happens primarily because of custom deserializers
return childVisitor.getTarget();

View File

@ -54,10 +54,10 @@ final class JsonSerializationContextDefault implements JsonSerializationContext
}
JsonElement serialize(Object src, Type typeOfSrc, boolean preserveType) {
ObjectNavigator on = factory.create(new ObjectTypePair(src, typeOfSrc, preserveType));
ObjectNavigator on = factory.create();
JsonSerializationVisitor visitor =
new JsonSerializationVisitor(factory, serializeNulls, serializers, this, ancestors);
on.accept(visitor);
on.accept(new ObjectTypePair(src, typeOfSrc, preserveType), visitor);
return visitor.getJsonElement();
}
}

View File

@ -142,10 +142,10 @@ final class JsonSerializationVisitor implements ObjectNavigator.Visitor {
}
private JsonElement getJsonElementForChild(ObjectTypePair fieldValueTypePair) {
ObjectNavigator on = factory.create(fieldValueTypePair);
ObjectNavigator on = factory.create();
JsonSerializationVisitor childVisitor =
new JsonSerializationVisitor(factory, serializeNulls, serializers, context, ancestors);
on.accept(childVisitor);
on.accept(fieldValueTypePair, childVisitor);
return childVisitor.getJsonElement();
}

View File

@ -80,8 +80,7 @@ final class ObjectNavigator {
}
private final ExclusionStrategy exclusionStrategy;
private final ObjectTypePair objTypePair;
private ReflectingFieldNavigator reflectingFieldNavigator;
private final ReflectingFieldNavigator reflectingFieldNavigator;
/**
* @param objTypePair
@ -90,9 +89,8 @@ final class ObjectNavigator {
* the concrete strategy object to be used to filter out fields of an
* object.
*/
ObjectNavigator(ObjectTypePair objTypePair, ExclusionStrategy exclusionStrategy) {
ObjectNavigator(ExclusionStrategy exclusionStrategy) {
reflectingFieldNavigator = new ReflectingFieldNavigator(exclusionStrategy);
this.objTypePair = objTypePair;
this.exclusionStrategy = Preconditions.checkNotNull(exclusionStrategy);
}
@ -100,7 +98,7 @@ final class ObjectNavigator {
* Navigate all the fields of the specified object. If a field is null, it
* does not get visited.
*/
public void accept(Visitor visitor) {
public void accept(ObjectTypePair objTypePair, Visitor visitor) {
if (exclusionStrategy.shouldSkipClass(Types.getRawType(objTypePair.type))) {
return;
}

View File

@ -26,8 +26,8 @@ import com.google.gson.internal.Preconditions;
* @author Joel Leitch
*/
final class ObjectNavigatorFactory {
private final ExclusionStrategy strategy;
private final FieldNamingStrategy2 fieldNamingPolicy;
private final ObjectNavigator objectNavigator;
/**
* Creates a factory object that will be able to create new
@ -39,8 +39,9 @@ final class ObjectNavigatorFactory {
* names
*/
public ObjectNavigatorFactory(ExclusionStrategy strategy, FieldNamingStrategy2 fieldNamingPolicy) {
this.strategy = (strategy == null ? new NullExclusionStrategy() : strategy);
this.fieldNamingPolicy = Preconditions.checkNotNull(fieldNamingPolicy);
this.objectNavigator = new ObjectNavigator(
strategy == null ? new NullExclusionStrategy() : strategy);
}
/**
@ -52,8 +53,8 @@ final class ObjectNavigatorFactory {
* {@code srcObject} while taking into consideration the
* {@code type}.
*/
public ObjectNavigator create(ObjectTypePair objTypePair) {
return new ObjectNavigator(objTypePair, strategy);
public ObjectNavigator create() {
return objectNavigator;
}
FieldNamingStrategy2 getFieldNamingPolicy() {

View File

@ -69,6 +69,13 @@ public class UncategorizedTest extends TestCase {
assertFalse(gson.toJson(target).contains("DEFAULT_VALUE"));
}
public void testGsonInstanceReusableForSerializationAndDeserialization() {
BagOfPrimitives bag = new BagOfPrimitives();
String json = gson.toJson(bag);
BagOfPrimitives deserialized = gson.fromJson(json, BagOfPrimitives.class);
assertEquals(bag, deserialized);
}
/**
* This test ensures that a custom deserializer is able to return a derived class instance for a
* base class object. For a motivation for this test, see Issue 37 and