diff --git a/gson/src/main/java/com/google/gson/JsonDeserializationContextDefault.java b/gson/src/main/java/com/google/gson/JsonDeserializationContextDefault.java index fb357480..bd5bccb0 100644 --- a/gson/src/main/java/com/google/gson/JsonDeserializationContextDefault.java +++ b/gson/src/main/java/com/google/gson/JsonDeserializationContextDefault.java @@ -60,8 +60,8 @@ final class JsonDeserializationContextDefault implements JsonDeserializationCont JsonDeserializationContext context) throws JsonParseException { JsonArrayDeserializationVisitor visitor = new JsonArrayDeserializationVisitor( 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 visitor = new JsonObjectDeserializationVisitor( 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 visitor = new JsonObjectDeserializationVisitor( 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; } diff --git a/gson/src/main/java/com/google/gson/JsonDeserializationVisitor.java b/gson/src/main/java/com/google/gson/JsonDeserializationVisitor.java index 7937480b..4f48d4ae 100644 --- a/gson/src/main/java/com/google/gson/JsonDeserializationVisitor.java +++ b/gson/src/main/java/com/google/gson/JsonDeserializationVisitor.java @@ -105,8 +105,8 @@ abstract class JsonDeserializationVisitor 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(); diff --git a/gson/src/main/java/com/google/gson/JsonSerializationContextDefault.java b/gson/src/main/java/com/google/gson/JsonSerializationContextDefault.java index f44302e8..218df818 100644 --- a/gson/src/main/java/com/google/gson/JsonSerializationContextDefault.java +++ b/gson/src/main/java/com/google/gson/JsonSerializationContextDefault.java @@ -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(); } } diff --git a/gson/src/main/java/com/google/gson/JsonSerializationVisitor.java b/gson/src/main/java/com/google/gson/JsonSerializationVisitor.java index d67b2035..c68d28c2 100644 --- a/gson/src/main/java/com/google/gson/JsonSerializationVisitor.java +++ b/gson/src/main/java/com/google/gson/JsonSerializationVisitor.java @@ -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(); } diff --git a/gson/src/main/java/com/google/gson/ObjectNavigator.java b/gson/src/main/java/com/google/gson/ObjectNavigator.java index b1a10df2..1b0d7405 100644 --- a/gson/src/main/java/com/google/gson/ObjectNavigator.java +++ b/gson/src/main/java/com/google/gson/ObjectNavigator.java @@ -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; } diff --git a/gson/src/main/java/com/google/gson/ObjectNavigatorFactory.java b/gson/src/main/java/com/google/gson/ObjectNavigatorFactory.java index f20d0b38..6e82bd35 100644 --- a/gson/src/main/java/com/google/gson/ObjectNavigatorFactory.java +++ b/gson/src/main/java/com/google/gson/ObjectNavigatorFactory.java @@ -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() { diff --git a/gson/src/test/java/com/google/gson/functional/UncategorizedTest.java b/gson/src/test/java/com/google/gson/functional/UncategorizedTest.java index fac7348c..9fe8c404 100644 --- a/gson/src/test/java/com/google/gson/functional/UncategorizedTest.java +++ b/gson/src/test/java/com/google/gson/functional/UncategorizedTest.java @@ -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