繁体   English   中英

Android活动之间传递对象的限制

[英]Limitation to passing objects between Android activities

如其他地方所述; 在Android活动之间传递实例的方式是使传递对象实现可序列化或可打包的接口。 如我所见,这很好,只要您的Android应用旨在显示您的狗的年龄和名字即可。 在不使用静态引用的情况下使用稍微高级的对象是有问题的。

要传递的对象正在使用例如外部库。 为了使序列化工作,所有使用过的类(包括库中的类)都需要声明此接口,否则Android会抛出运行时IOException,表明无法序列化该对象(某些内容不暗示该可序列化接口或没有无参数)构造函数)。 因此,我猜想,可序列化的方法需要重新编译库。 宗地方法要求将对象的字段写入某些输出。 此输出支持自定义对象,但是再次,传递的对象(包括库)需要实现可序列化的接口才能工作。

使用外部库传递实例的解决方案是什么?

一种方法是为要在活动之间传递的每个不可序列化的类型实现Serializer类。 这是一个简单的Serializer接口:

public interface Serializer {
    void serialize(Object object, DataOutputStream out);

    Object deserialize(DataInputStream in);
}

之后,您可以使用或任何其他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活动传递对象,并在需要时将其反序列化回您的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM