Я использую GSON для применения универсального сериализатора ко всем подклассам абстрактного Base
класса.Тем не менее, GSON не будет вызывать мой сериализатор, если ему даны фактические подклассы класса Base
, если явно не указано использовать Base.class
в качестве приведения.Вот простой пример того, о чем я говорю.
public interface Base<T>{
String getName();
public List<Object> getChildren();
}
public class Derived1 implements Base<Integer>{
private Integer x = 5;
String getName(){
return "Name: " + x;
}
List<Object> getChildren(){
return Lists.newArrayList(new Derived2(), "Some string");
}
}
public class Derived2 implements Base<Double>{
private Double x = 6.3;
String getName(){
return "Name: " + x;
}
List<Object> getChildren(){
return new List<>();
}
}
Я создаю сериализатор следующим образом:
JsonSerializer customAdapter = new JsonSerializer<Base>(){
@Override
JsonElement serialize(Base base, Type sourceType, JsonSerializationContext context){
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("name", base.getName());
JsonArray jsonArray = new JsonArray();
for (Object child : base.getChildren()){
jsonArray.add(context.serialize(child));
}
if (jsonArray.size() != 0){
jsonObject.add("children", jsonArray);
}
}
};
Gson customSerializer = new GsonBuilder()
.registerTypeAdapter(Base.class, customAdapter)
.create();
Однако, применяя мой собственный сериализатор к List
из подклассов не имеет желаемого эффекта.
customSerializer.toJson(Lists.newArrayList(new Derived1(), new Derived2()));
Это применяет сериализацию GSON по умолчанию к моим подклассам.Есть ли простой способ заставить мой пользовательский сериализатор использовать мой пользовательский адаптер на всех подклассах родительского класса?Я подозреваю, что одним из решений является использование отражения для итерации по всем подклассам Base
и регистрации пользовательского адаптера, но я бы хотел, если возможно, избежать чего-то подобного.
Примечание: мне все равноо десериализации прямо сейчас.