Java 序列化ArrayList

Java 序列化ArrayList,java,android,serialization,arraylist,Java,Android,Serialization,Arraylist,我正在尝试编写一个Android游戏,我希望能够暂停游戏,即使用户希望返回主菜单或活动被系统终止。onSaveInstanceState似乎无法完全控制何时可以读回该捆绑包,而且据我所知,该捆绑包只适用于短时间。所以我想序列化我拥有的一些ArrayList,然后再将它们读回。我没有得到任何编译错误,程序也没有崩溃。但是,数据要么永远不会被写入,要么永远不会被读取。我不知道是哪一个。我的serializeData方法在onDestroy中调用,反序列化数据在onCreate中调用。以下是我编写和读

我正在尝试编写一个Android游戏,我希望能够暂停游戏,即使用户希望返回主菜单或活动被系统终止。onSaveInstanceState似乎无法完全控制何时可以读回该捆绑包,而且据我所知,该捆绑包只适用于短时间。所以我想序列化我拥有的一些ArrayList,然后再将它们读回。我没有得到任何编译错误,程序也没有崩溃。但是,数据要么永远不会被写入,要么永远不会被读取。我不知道是哪一个。我的serializeData方法在onDestroy中调用,反序列化数据在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();
    }
}
public void序列化数据(字符串文件名,ArrayList){
文件输出流;
试一试{
fos=openFileOutput(文件名、上下文、模式\私有);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(arrayList);
oos.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
@抑制警告(“未选中”)
私有void反序列化数据(字符串文件名,ArrayList){
试一试{
FileInputStream fis=openFileInput(文件名);
ObjectInputStream ois=新ObjectInputStream(fis);
arrayList=(arrayList)ois.readObject();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}catch(classnotfounde异常){
e、 printStackTrace();
}
}

任何帮助都将不胜感激!提前谢谢

我看不出该代码有明显的问题


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

让我告诉你一件事:永远不要使用onDestroy()方法保存数据。改为使用onPause()或onStop()。永远不要指望onDestroy()方法来保存数据或调用某些函数

使用onDestroy关闭连接并完成资源等的使用。如果你想了解更多关于这方面的信息,你应该看看

除此之外,您的代码看起来还不错。只需再添加一件事:将oos.flush()放在oos.close()的正上方


不要忘记关闭objectInputStream对象。

序列化时,您可以写入ByteArrayOutputStream,然后使用平台的默认字符集将字节解码为字符串。将此字符串存储到SharedReferences中。反序列化时,只需从字符串中获取字节,并使用该字符串创建ByteArrayInputStream,然后将其馈送到ObjectInputStream。
是否确实要终止您的活动?您的活动可能在onPasue/onResume之间振荡

虽然savestate不用于持久化,但SharedReference足以保存对象的ArrayList。我实际上想使用SharedReference,但我认为您只能在其中存储原语。你怎么能在里面放一个ArrayList呢?代码看起来不错。你是如何确定这不是在写什么的?@Jigar Joshi-org.life.java我不确定它是在写还是在读。我认为问题在于读取,因为它没有抛出任何FileNotFoundException或任何东西。但是我不知道。但是为什么要使用共享pref呢。如果他想,让他连载……我想我们应该设法解决这个问题。而不是通过使用共享prefs忽略它。。。。我建议不要从onDestroy()调用该函数,而是从onPause或onStop()调用它。