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:
parent
b819307de8
commit
13dc7b6f02
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user