如何跨Activity重启保留复杂对象?

Mat*_*ias 22 lifecycle serialization android android-activity

假设我有一个可序列化的Java Bean对象.我想它存储起来安全当活动经过的onDestroy()的目的(即的onSaveInstanceState()是叫).

我正在寻找一种不涉及创建数据库并将对象写入其中的方法(主要是因为a)Android的DB API非常糟糕b)因为数据库使应用程序更新成为一场噩梦,因为没有适当的支持来应用迁移).

我想到将对象序列化为ByteArrayOutputStream,base64编码并将其作为字符串写入SharedPreferences文件.还是那太远了?

UPDATE

也许那个序列化到字符串的想法毕竟不是那么糟糕,似乎运作得很好.这就是我现在正在做的事情:

    public static String objectToString(Serializable object) {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        new ObjectOutputStream(out).writeObject(object);
        byte[] data = out.toByteArray();
        out.close();

        out = new ByteArrayOutputStream();
        Base64OutputStream b64 = new Base64OutputStream(out);
        b64.write(data);
        b64.close();
        out.close();

        return new String(out.toByteArray());
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

public static Object stringToObject(String encodedObject) {
    try {
        return new ObjectInputStream(new Base64InputStream(
                new ByteArrayInputStream(encodedObject.getBytes()))).readObject();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

在onDestroy()中我可以简单地将Base64字符串写入首选项文件,在下一次活动启动期间我再次读取它之前它是安全的.它比我预期的要快得多,除非你的bean携带大量数据,否则效果非常好.更好的是,您不必维护数据库架构.

不过,我很好奇其他人是如何做到这一点的.

Com*_*are 9

我正在寻找一种不涉及创建数据库并将对象写入其中的方法(主要是因为a)Android的DB API非常糟糕b)因为数据库使应用程序更新成为一场噩梦,因为没有适当的支持来应用迁移).

Android的API实际上是相当合理的,主要是因为它是SQLite API的薄包装,而SQLite API对于嵌入式数据库来说是相当合理的.此外,Android确实为应用程序升级的架构升级提供帮助SQLiteOpenHelper.

它比我预期的要快得多,除非你的bean携带大量数据,否则效果非常好.

我听说有更多的开发人员从序列化中逃避,而不是听说过人们长期成功.就在过去的几天里,在SO #android上,我与一个人拼命地试图从他的应用程序中删除序列化.

更好的是,您不必维护数据库架构.

哦,是的,你这样做.当您更新应用程序并修改课程时,您认为会发生什么?执行簿记以弄清楚如何从新版本的类反序列化该类的旧版本是一件苦差事,这是开发人员放弃序列化的原因之一.另外,不要忘记序列化不是事务性的,而SQLite是.

  • 给每个人自己. (5认同)