Десериализация списка <MyInterface>, который содержит список <MyOtherInterface>с использованием Gson - PullRequest
0 голосов
/ 21 октября 2018

У меня были огромные проблемы с десериализацией List<IWorkout>, так как это выкинуло бы

java.lang.RuntimeException: Unable to start activity ComponentInfo{MY PACKAGE}: java.lang.RuntimeException: Unable to invoke no-args constructor for interface MY INTERFACE. Registering an InstanceCreator with Gson for this type may fix this problem.

Но я решил это, десериализовав его до List<Workout> (который реализует интерфейс IWorkout), а затем добавьте его в List<IWorkout>.

Пример кода моего решения:

public ArrayList <IWorkout> loadUserWorkoutList(){
    Gson gson = new Gson();

    Type workoutListType = new TypeToken<ArrayList<Workout>>(){}.getType();

    List <Workout> workoutList = gson.fromJson(loadWorkoutDataFromSharedPreferences(), workoutListType);

    if (workoutList == null){
        workoutList = new ArrayList<>();
    }

    ArrayList<IWorkout> iWorkoutList = new ArrayList<>(workoutList);

    return iWorkoutList;
}

Но теперь проблема состоит в том, что Тренировка содержит еще один List<IExercise>, который я могу 't (или, по крайней мере, не могу понять, как) выполнить этот «трюк».Весь список IWorkout сериализуется следующим образом:

private String workoutListToJsonString(List<IWorkout> list) {
    Gson gson = new Gson();

    String jsonString = gson.toJson(list);

    return jsonString;
}

и выдает ту же ошибку, что и раньше, когда я пытаюсь десериализовать его.

У кого-нибудь есть идеи, как решить эту проблему?

Я пытался использовать адаптер, предоставленный Narthi , но безуспешно.

Заранее спасибо

...