GsonProvider
The Gson provider manages a shared Gson
instance and allows services and plugins to register custom JSON serialization support. This serves multiple purposes:
- JSON formatting is shared across services that use it for serialization
- Services can register custom serialization for private types (See
KeybindingConfig
for an example of this) - Plugins that register custom config containers with
ConfigManager
can register support for their own custom types.
Registering custom serialization
The Gson provider offers methods that allows registering the following:
TypeAdapter
- For handling serialization and deserialization of a type.InstanceCreator
- For assisting construction of types that do not provide no-arg constructors.JsonSerializer
- For specifying serialization support only.JsonDeserializer
- For specifying deserialization support only.
For more details on how to use each of the given types, see the Gson JavaDocs.
TypeAdapter:
gsonProvider.addTypeAdapter(ExampleType.class, new TypeAdapter<>() {
@Override
public void write(JsonWriter out, ExampleType value) throws IOException {
// Manual serialization of 'value' goes here using 'out'
}
@Override
public ExampleType read(JsonReader in) throws IOException {
// Manual deserialization of the type from 'in' goes here
return new ExampleType(...);
}
});
InstanceCreator:
gsonProvider.addTypeInstanceCreator(ExampleType.class, type -> new ExampleType(...));
JsonSerializer:
gsonProvider.addTypeSerializer(ExampleType.class, (src, typeOfSrc, context) -> {
// Manual serialization of 'T src' into a 'JsonElement' return value goes here
return new JsonObject();
});
JsonDeserializer:
gsonProvider.addTypeDeserializer(ExampleType.class, (json, typeOfT, context) -> {
// Manual deserialization of (JsonElement json) goes here
return new ExampleType(...);
});