【问题标题】:Serializing an ArrayList序列化 ArrayList
【发布时间】:2011-07-08 14:26:28
【问题描述】:

我正在尝试编写一个 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();
    }
}

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

【问题讨论】:

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

标签: java android serialization arraylist


【解决方案1】:

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

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

除此之外,您的代码似乎还不错。只需再添加一件事:在 oos.close() 上方放置一个 oos.flush()。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 2013-05-07
        • 2012-02-05
        • 1970-01-01
        • 2019-03-17
        • 1970-01-01
        • 2011-04-05
        相关资源
        最近更新 更多