序列化ArrayList

时间:2011-03-04 06:13:49

标签: java android serialization arraylist

我正在尝试编写Android游戏,即使用户想要返回主菜单或活动被系统杀死,我也希望能够暂停游戏。 onSaveInstanceState似乎没有给我一个很大的控制权,我什么时候可以读回包,再加上我能说的,这个包只能在很短的时间内使用。所以我想序列化一些我拥有的ArrayLists,然后再读回来。我没有得到任何编译错误,也没有程序崩溃。但是,数据要么永远不会被写入,要么永远不会被读取。我不确定是哪一个。我在onDestroy中调用了serializeData方法,并从onCreate调用了deserializeData。这是我编写和阅读数据的代码:

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 个答案:

答案 0 :(得分:4)

让我告诉你一件事:永远不要使用onDestroy()方法来保存你的数据。请改用onPause()或onStop()。您永远不应该依赖onDestroy()方法来保存数据或调用某些函数。

使用onDestroy关闭连接并完成使用资源等。如果您想了解更多相关信息,请查看here.

除了你的代码似乎没问题。再添加一件事:将oos.flush()放在oos.close()上面。

并且不要忘记关闭objectInputStream对象。

感谢。

答案 1 :(得分:0)

我看不出该代码存在明显问题。

我会在关闭ObjectOutputStream之后和打开ObjectInputStream之前尝试添加一些代码,以打印出文件的绝对名称和大小。

答案 2 :(得分:0)

在序列化时,您可以写入ByteArrayOutputStream,然后使用平台的默认字符集将字节解码为字符串。将此字符串存储到SharedPreferences中。在反序列化时,只需从字符串中获取字节并使用它创建一个ByteArrayInputStream并将其提供给ObjectInputStream。
您确定您的活动被杀死了吗?可能是您的活动在onPasue / onResume之间振荡。