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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -69,6 +69,13 @@ public class UncategorizedTest extends TestCase {
assertFalse(gson.toJson(target).contains("DEFAULT_VALUE")); 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 * 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 * base class object. For a motivation for this test, see Issue 37 and