HashMap i używanie jej pomiedzy różnymi aktywnościami w aplikacji

0

Cześć, w aplikacji używam pomiędzy różnymi aktywnościami Mapy.

Map<String, Integer> barcodeMap;
barcodeMap = new HashMap<String, Integer>();

do zapisu używam metody:

void saveHashMapToMemory(){
        try {
            FileOutputStream fileOutputStream = openFileOutput("BarcodesMap", MODE_PRIVATE);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(barcodeMap);
            objectOutputStream.flush();
            objectOutputStream.close();
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }

do odczytu:

void loadHashMapFromMemory() throws ClassNotFoundException {
        File file = getApplicationContext().getFileStreamPath("BarcodesMap");

        if (file.exists()) {
            try {
                FileInputStream fileInputStream = new FileInputStream(file);
                ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
                barcodeMap = (Map) objectInputStream.readObject();
                objectInputStream.close();
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            Toast.makeText(getApplicationContext(), "File don't exist!", Toast.LENGTH_SHORT).show();
        }
    }

Aplikacja działa i kompiluje sie. Ale gdy chce utworzyć plik APK, to otrzymuję błąd że używam przestarzałego API :

C:\AndroidWorkspace\...\SaveActivity.java:
uses or overrides a deprecated API.
Recompile with -Xlint:deprecation for details.
Some input files use unchecked or unsafe operations.
Recompile with -Xlint:unchecked for details.

sądze że problem jest w linijce:

barcodeMap = (Map) objectInputStream.readObject();

W jaki sposób powinno się to zrobić? Proszę o pomoc

wzorowałem sie na tym:
https://stackoverflow.com/questions/17728449/how-can-i-store-a-data-structure-such-as-a-hashmap-internally-in-android

3

Ja bym to serializował jak człowiek do jakiegoś jsona/xmla a nie do bloba. Bardziej elegancko, czytelnie i bezpiecznie.

0
Shalom napisał(a):

Ja bym to serializował jak człowiek do jakiegoś jsona/xmla a nie do bloba. Bardziej elegancko, czytelnie i bezpiecznie.

Dzięki za podpowiedź. Zrobiłem tak:
Zapis

Gson gson = new Gson();
        MapWrapper wrapper = new MapWrapper();
        wrapper.setBarcodeMap(barcodeMap);
        String serializedHashMap = gson.toJson(wrapper);
        SharedPreferences.Editor editor = getSharedPreferences(MY_HASHMAP, MODE_PRIVATE).edit();
        editor.putString("hashmap", serializedHashMap);
        editor.commit();

odczyt

SharedPreferences preferences = getSharedPreferences(MY_HASHMAP, MODE_PRIVATE);
        String wrapperStr = preferences.getString("hashmap", "");
        Gson gson = new Gson();
        MapWrapper wrapper = gson.fromJson(wrapperStr, MapWrapper.class);
        if (wrapper != null) {
            barcodeMap = wrapper.getBarcodeMap();
        }

Rozumiem że to jest dobre rozwiązanie i nie jakieś przestarzałe?

1

Na pewno bardziej niż ta pierwsza opcja. Binarna serializacja Javy to słaby pomysł i choćby ryzyko że będzie update javy i nagle ci się to już nie wczyta, a json czy xml to dość uniwersalne formaty. Są też czytelne dla człowieka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1