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