- * Method {@code registerDefault} has been added to avoid hard errors during deserialization. - * Deserialization still fails if the registered value is null or not defined. - *
- * - *{@code - * abstract class Shape { - * int x; - * int y; - * } - * class Circle extends Shape { - * int radius; - * } - * class Rectangle extends Shape { - * int width; - * int height; - * } - * class Diamond extends Shape { - * int width; - * int height; - * } - * class Drawing { - * Shape bottomShape; - * Shape topShape; - * } - * }- *
Without additional type information, the serialized JSON is ambiguous. Is - * the bottom shape in this drawing a rectangle or a diamond?
{@code - * { - * "bottomShape": { - * "width": 10, - * "height": 5, - * "x": 0, - * "y": 0 - * }, - * "topShape": { - * "radius": 2, - * "x": 4, - * "y": 1 - * } - * }}- * This class addresses this problem by adding type information to the - * serialized JSON and honoring that type information when the JSON is - * deserialized:
{@code - * { - * "bottomShape": { - * "type": "Diamond", - * "width": 10, - * "height": 5, - * "x": 0, - * "y": 0 - * }, - * "topShape": { - * "type": "Circle", - * "radius": 2, - * "x": 4, - * "y": 1 - * } - * }}- * Both the type field name ({@code "type"}) and the type labels ({@code - * "Rectangle"}) are configurable. - * - *
{@code - * RuntimeTypeAdapterFactory- * Next register all of your subtypes. Every subtype must be explicitly - * registered. This protects your application from injection attacks. If you - * don't supply an explicit type label, the type's simple name will be used. - *shapeAdapterFactory - * = RuntimeTypeAdapterFactory.of(Shape.class, "type"); - * }
{@code - * shapeAdapterFactory.registerSubtype(Rectangle.class, "Rectangle"); - * shapeAdapterFactory.registerSubtype(Circle.class, "Circle"); - * shapeAdapterFactory.registerSubtype(Diamond.class, "Diamond"); - * }- * Finally, register the type adapter factory in your application's GSON builder: - *
{@code - * Gson gson = new GsonBuilder() - * .registerTypeAdapterFactory(shapeAdapterFactory) - * .create(); - * }- * Like {@code GsonBuilder}, this API supports chaining:
{@code - * RuntimeTypeAdapterFactory- * - *shapeAdapterFactory = RuntimeTypeAdapterFactory.of(Shape.class) - * .registerSubtype(Rectangle.class) - * .registerSubtype(Circle.class) - * .registerSubtype(Diamond.class); - * }
{@code - * Diamond diamond = new Diamond(); - * String json = gson.toJson(diamond, Shape.class); - * }- * And then: - *
{@code - * Shape shape = gson.fromJson(json, Shape.class); - * }- */ -final class RuntimeTypeAdapterFactory