【问题标题】:Limitation to passing objects between Android activities在 Android 活动之间传递对象的限制
【发布时间】:2012-04-26 10:46:36
【问题描述】:
如其他地方所述; Android活动之间传递实例的方式,要么使传递的对象实现可序列化的接口,要么实现可打包的接口。在我看来,只要您的 Android 应用程序旨在显示您的狗的年龄和名字,这很好。在不使用静态引用的情况下使用稍微高级一点的对象是有问题的。
要传递的对象正在使用例如用于其目的的外部库。
为了使所有使用的类(包括库中的类)能够进行序列化,需要声明此接口,否则 Android 将抛出运行时 IOException,说明对象无法序列化(某些东西不是隐含的可序列化接口或没有无参数)构造函数)。因此,我猜想,可序列化的工作方法需要重新编译库。
Parcel 方法需要将对象的字段写入某些输出。此输出支持自定义对象,但传递对象(包括库)再次需要实现可序列化接口才能工作。
使用外部库传递实例的解决方案是什么?
【问题讨论】:
标签:
android
android-activity
【解决方案1】:
其中一种方法是为您希望在活动之间传递的每个不可序列化类型实现序列化器类。下面是一个简单的 Serializer 接口:
public interface Serializer {
void serialize(Object object, DataOutputStream out);
Object deserialize(DataInputStream in);
}
之后,您可以使用this 或任何其他Base64 编码器/解码器将DataOutputStream 转换为String 或其他可序列化类型。用于此目的的方法如下:
private String serializeToString(Object object, Serializer serializer) {
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
DataOutputStream dStream = new DataOutputStream(bStream);
try {
serializer.serialize(object, dStream);
} catch (IOException e) {
logger.error(e, "Couldn't serialize " + object);
return null;
}
return Base64.encodeToString(bStream.toByteArray(), false);
}
private Object deserializeFromString(String string, Serializer serializer) {
try {
return serializer.deserialize(
new DataInputStream(
new ByteArrayInputStream(
Base64.decode(string))));
} catch (IOException e) {
logger.error(e, "Couldn't deserialize [" + string + "]");
return null;
}
}
之后,您可以简单地将对象通过序列化为String 的活动传递,并在需要时将其反序列化回您的对象。