Мне нужно десериализовать глубокую иерархию объектов, используя библиотеку Java Gson.
Я пытался использовать RuntimeTypeAdapterFactory из дополнений json, но, похоже, он не работает, как я ожидал, если зарегистрированные типы не являются прямыми потомками базового типа.
Вот пример, демонстрирующий мою иерархию:
interface Base {
}
interface NormalChild extends Base {
}
class SpecialChild implements Base {
}
class Child1 implements NormalChild {
}
class Child2 implements NormalChild {
}
// etc...
А вот десериализатор:
class Deserializer {
private Gson GSON = new GsonBuilder().registerTypeAdapterFactory(RuntimeTypeAdapterFactory.of(Base.class, "type")
.registerSubtype(SpecialChild.class)
.registerSubtype(Child1.class)
.registerSubtype(Child2.class)
// etc...
)
.create();
public Base deserialize(JsonElement json) {
return GSON.fromJson(json, Base.class);
}
}
Я получаю сообщения об ошибках, связанных с конструктором «NormalChild», который не может быть вызван (поскольку NormalChild действительно является интерфейсом). Но как мне достичь ожидаемой функциональности регистрации только конкретных типов?