【发布时间】:2010-12-10 19:59:45
【问题描述】:
假设我有一个可序列化的 Java Bean 对象。我想在 Activity 故意通过 onDestroy() 时将其安全地存储起来(即 不 调用 onSaveInstanceState())。
我正在寻找一种不涉及创建数据库并将对象写入该数据库的方法(主要是因为 a)Android 的 DB API 很糟糕,b)因为数据库使应用程序更新成为一场噩梦,因为没有像样的支持用于应用迁移)。
我考虑将对象序列化为 ByteArrayOutputStream,base64 对其进行编码并将其作为字符串写入 SharedPreferences 文件。还是离得太远了?
更新
也许序列化到字符串的想法毕竟不是那么糟糕,似乎效果很好。这是我现在正在做的事情:
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;
}
在 onDestroy() 中,我可以简单地将 Base64 字符串写入首选项文件,它是安全的,直到我在下一次活动启动期间再次读取它。它比我预期的要快得多,除非你的 bean 携带大量数据,否则它工作得很好。更好的是,您不必维护数据库架构。
不过,我很好奇其他人是如何做到这一点的。
【问题讨论】:
-
不能只使用Bundle吗?
-
怎么样?如果您的活动通过 onSaveInstanceState(),即当它被运行时销毁时,您只能访问该包。
-
太棒了!我用了你的方法,它有效。我唯一遇到的问题是 Android SDK 中的 Base64InputStream 没有一个具有一个参数的构造函数,它现在有一个额外的 int 标志参数。如果对象中有任何 url 信息,只需将其设置为 0 或 8。
-
呸,Base64InputStream 仅在 Android 2.2 之后可用。 developer.android.com/reference/android/util/…
-
是的。但是,您可以简单地使用许多免费的 Base64 实现之一。或者链接到 Apache commons-codec 并使用 ProGuard 删除未使用的类。
标签: android serialization android-activity lifecycle