Десериализовать сериализованный ArrayList пользовательских объектов, добавить объект, а затем повторно сериализовать - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь сохранить список пользовательских массивов для приложения, которое я создаю в Android-студиях.Мне нужно иметь возможность добавлять новые объекты в список всякий раз, когда пользователь нажимает кнопку.Мой подход заключается в том, чтобы сначала инициализировать пустую сериализованную версию списка массивов с правильным типом (catch из try / catch).Затем для десериализации этого массива в виде списка временных массивов с именем «RecoTrackGameCollection», затем добавьте новый объект, повторно выполните сериализацию массива и сохраните его.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь добавить какие-либо объекты в «RecoTrackGameCollection», код завершается ошибкой и запускает перехват.

Спасибо, что нашли время взглянуть на это.Если вам нужна дополнительная информация, пожалуйста, сообщите мне.

try {
    //get shared pref
    SharedPreferences prefs = mContext.getSharedPreferences("SavedGames", Context.MODE_PRIVATE);
    //deserilize
    Gson gson = new Gson();
    String serialRecoverList = prefs.getString("SavedGames", "");
    Log.wtf("String Recover", serialRecoverList);
    Type type = new TypeToken<List<Game>>(){}.getType();
    ArrayList<Game> RecoTrackGameCollection = gson.fromJson(serialRecoverList, type);

    //add game
    RecoTrackGameCollection.add(SearchGameCollection.get(position));

    //reserilize
    Gson NewGson = new Gson();
    String JsonTrakingGames = NewGson.toJson(RecoTrackGameCollection);
    SharedPreferences.Editor editor = prefs.edit();

    editor.putString("Games", JsonTrakingGames);
    editor.commit();


    Toast.makeText(mContext , "Game Saved", Toast.LENGTH_LONG).show();

} catch (Exception e) {

    Gson gson = new Gson();
    String JsonTrakingGames = gson.toJson(TrackGameCollection);
    SharedPreferences prefs = mContext.getSharedPreferences("SavedGames", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();

    editor.putString("Games", JsonTrakingGames);

    editor.commit();

    Toast.makeText(mContext , "iniatlizing", Toast.LENGTH_LONG).show();

}

Это класс Game

public class Game {
    String name;
    double price;
    String link;
    //constructor
    Game(String name, double price,String link){
        this.name = name;
        this.price = price;
        this.link = link;

    }

}

Я считаю, что моя ошибка заключается в десерилизации массива.В частности это строка:

ArrayList<Game> RecoTrackGameCollection = gson.fromJson(serialRecoverList, 
type);

1 Ответ

0 голосов
/ 16 февраля 2019

Это потому, что вы использовали разные ключи при сохранении и получении списка.

Вы можете использовать следующее для сохранения списка:

private void saveGames(Lis<Game> games) {
   Gson gson = new Gson();
   String json = gson.toJson(games);
   SharedPreferences prefs = ctx.getSharedPreferences("SavedGames", Context.MODE_PRIVATE);
   SharedPreferences.Editor editor = prefs.edit();
   editor.putString("Games", json);
   editor.commit();
}

и следующее, чтобы получитьсписок:

private List<Game> getGames(Context ctx) {
  Gson gson = new Gson();
  SharedPreferences prefs = ctx.getSharedPreferences("SavedGames", Context.MODE_PRIVATE);

  String json = prefs.getString("Games", "");
  if(json.isEmpty()) {
    return new ArrayList<>();
  } else {
    Type type = new TypeToken<List<Game>>(){}.getType();
    return gson.fromJson(json, type);
  }

}
...