Ошибка при попытке десериализации пользовательского Arraylist Gson - PullRequest
0 голосов
/ 10 июля 2020

Я использую наследование java для создания суперкласса Player и подкласса Guest, который расширяет Player. Более того, я пытаюсь сохранить свой собственный список Player в формате json благодаря sharedPreferences и после этого вернуть его в формат списка. Я использую Gson для этого, но у меня следующая ошибка:

java.lang.RuntimeException: Unable to invoke no-args constructor for class fr.frenchapplab.partydrink.Model.Player. Registering an InstanceCreator with Gson for this type may fix this problem.

Caused by: java.lang.UnsupportedOperationException: Abstract class can't be instantiated! Class name: fr.frenchapplab.partydrink.Model.Player

Это мой код для сохранения и извлечения данных:

    private void savePlayers() {
       Type listType = new TypeToken<ArrayList<Player>>() {}.getType();
       String json = gson.toJson(players, listType);
    
       PreferenceManager.getDefaultSharedPreferences(requireContext()).edit().putString(KEY_SAVE_PLAYERS, json).apply();
   }

    private List<Player> loadPlayers() {
        String json = PreferenceManager.getDefaultSharedPreferences(requireContext()).getString(KEY_SAVE_PLAYERS, "");

        if (!json.isEmpty()) {
            Type listType = new TypeToken<ArrayList<Player>>(){}.getType();
            List<Player> players = gson.fromJson(json, listType);

            if (players != null && players.size() > 0)
                return players;
        }

        return new ArrayList<>();

    }

И это мой суперкласс и мой подкласс:

public abstract class Player implements Parcelable {

    private String playerName;
    private int game_drink_count;

    public Player(String playerName) {
        this.playerName = playerName;
    }


    public String getPlayerName() {
        return playerName;
    }
    public void setPlayerName(String playerName) {
        this.playerName = playerName;
    }

    public int getGame_drink_count() {
        return game_drink_count;
    }
    public void setGame_drink_count(int game_drink_count) {
        this.game_drink_count = game_drink_count;
    }



    // Parcelling part
    public Player(Parcel in) {
        this.playerName = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.playerName);
    }


}

public class Guest extends Player {

    public Guest(String playerName) {
        super(playerName);
    }

    public Guest(Parcel in) {
        super(in);
    }


    public static final Parcelable.Creator<Guest> CREATOR = new Parcelable.Creator<Guest>() {
        public Guest createFromParcel(Parcel in) {
            return new Guest(in);
        }

        public Guest[] newArray(int size) {
            return new Guest[size];
        }
    };

    public int describeContents() {
        return 0;
    }
}
...