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 {
|
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;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user