Использование десериализатора ustom GSON с производными классами

#android #json #gson

#Android #json #gson

Вопрос:

Я хотел создать некоторые абстракции, поэтому я бы уменьшил количество дублируемого кода.

Простой пример (мои реальные объекты намного сложнее — вот почему я разбираю их вручную, но и B, и C совместно используют много данных с A):

 public abstract class A {
   int x;
   int y;
}

public class B extends A {
   int z;
}

public class C extends A {
   int w;
}
  

Я написал два пользовательских десериализатора, и оба они являются производными от некоторого абстрактного десериализатора, который позаботится о заполнении полей x и y базового класса, а затем он должен заполнять поля в зависимости от определенного класса.

 gsonBuilder.registerTypeAdapter(B.class, new BsonDeserializer());
gsonBuilder.registerTypeAdapter(C.class, new CJsonDeserializer());
  

Моя проблема в том, что Gson будет учитывать только суперкласс при регистрации, поэтому он не будет использовать два разных десериализатора для двух разных классов, только первый.

Я знаю о том, что доступен класс RuntimeTypeAdapter, но AFAIK, это заставило бы меня изменить json на моем сервере — скажем, каждый JSON будет содержать поле «тип» (и я действительно не могу этого сделать — мне не разрешено) (?)

Существуют ли какие-либо хорошие подходы к решению такого рода проблем?