Сериализация ArrayList - PullRequest
4 голосов
/ 04 марта 2011

Я пытаюсь написать игру для Android, и я хотел бы иметь возможность сделать паузу в игре, даже если пользователь захочет вернуться в главное меню или действие будет прервано системой.onSaveInstanceState, кажется, не дает мне большого контроля над тем, когда я могу прочитать пакет обратно, и, как я могу сказать, пакет хорош только в течение коротких периодов времени.Поэтому я хочу сериализовать несколько имеющихся у меня массивов ArrayList, а затем прочитать их обратно.Я не получаю никаких ошибок компиляции и не происходит сбой программы.Но данные либо никогда не записываются, либо никогда не читаются.Я не уверен, какой.Мой метод serializeData вызывается из onDestroy, а метод deserializeData вызывается из onCreate.Вот мой код для записи и чтения данных:

public void serializeData(String filename, ArrayList<String>arrayList) {
    FileOutputStream fos;
    try {
        fos = openFileOutput(filename, Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(arrayList); 
        oos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();
    }
}

@SuppressWarnings("unchecked")
private void deserializeData(String filename, ArrayList<String>arrayList){
    try{
        FileInputStream fis = openFileInput(filename);
        ObjectInputStream ois = new ObjectInputStream(fis);
        arrayList = (ArrayList<String>)ois.readObject();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();
    }catch(ClassNotFoundException e){
        e.printStackTrace();
    }
}

Любая помощь будет принята с благодарностью!Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 04 марта 2011

Позвольте мне сказать вам одну вещь: никогда не используйте метод onDestroy () для сохранения ваших данных.Вместо этого используйте onPause () или onStop ().Вы никогда не должны рассчитывать на метод onDestroy () для сохранения данных или вызова некоторых функций.

Используйте onDestroy для закрытия соединений и завершения использования ресурсов и тому подобного.Если вы хотите узнать больше об этом, вам следует взглянуть здесь.

Кроме этого, ваш код выглядит нормально.Просто добавьте еще одну вещь: поместите oos.flush () чуть выше oos.close ().

И не забудьте закрыть объект objectInputStream.

Спасибо.

0 голосов
/ 04 марта 2011

Во время сериализации вы можете записать в ByteArrayOutputStream и затем декодировать байты в строку, используя набор символов платформы по умолчанию. Сохраните эту строку в SharedPreferences. При десериализации просто получите байты из строки и создайте ByteArrayInputStream, используя это, и передайте его в ObjectInputStream.
Вы уверены, что ваша деятельность прекращается? Может случиться так, что ваша активность колеблется между onPasue / onResume.

0 голосов
/ 04 марта 2011

Я не вижу очевидной проблемы с этим кодом.

Я бы попытался добавить некоторый код после закрытия ObjectOutputStream и перед открытием ObjectInputStream, чтобы распечатать абсолютное имя и размер файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...