Creates type adapters for types handled in the following ways:
- Deserialization
If there's an annotation designating a parameterized constructor, invoke that for fields correlating to named
parameter annotations. Otherwise, use ConstructorConstructor
, and set fields via reflection.
Notes: primitive constructor params are set to the Java defaults (0 or false) if not present; and the empty object
({}) is treated as a null if the constructor for the object throws an NPE.
- Serialization
Serialize based on reflective access to fields, delegating to ReflectiveTypeAdaptor.
Example: Using javax inject to select a constructor and corresponding named parameters
import NamingStrategies.*;
serializationStrategy = new AnnotationOrNameFieldNamingStrategy(
new ExtractSerializedName(), new ExtractNamed());
deserializationStrategy = new AnnotationConstructorNamingStrategy(
ImmutableSet.of(javax.inject.Inject.class),
ImmutableSet.of(new ExtractNamed()));
factory = new DeserializationConstructorAndReflectiveTypeAdapterFactory(new ConstructorConstructor(),
serializationStrategy, Excluder.DEFAULT, deserializationStrategy);
gson = new GsonBuilder(serializationStrategy).registerTypeAdapterFactory(factory).create();
The above would work fine on the following class, which has no gson-specific annotations:
private static class ImmutableAndVerifiedInCtor {
final int foo;
@Named("_bar")
final int bar;
@Inject
ImmutableAndVerifiedInCtor(@Named("foo") int foo, @Named("_bar") int bar) {
if (foo < 0)
throw new IllegalArgumentException("negative!");
this.foo = foo;
this.bar = bar;
}
}