0

他の場所で述べたように; Android アクティビティ間でインスタンスを渡す方法は、渡すオブジェクトにシリアライズ可能またはパーセル可能なインターフェイスを実装させることです。Android アプリが犬の年齢と名前を表示することを意図している限り、これは問題ありません。静的参照を使用せずに少し高度なオブジェクトを使用すると問題が発生します。

渡されるオブジェクトは、その目的のために外部ライブラリなどを使用しています。使用されているすべてのクラス (ライブラリを含む) をシリアル化するには、このインターフェイスを宣言する必要があります。そうしないと、Android はランタイム IOException をスローし、オブジェクトをシリアル化できなかったことを示します (何かが実装されていません。シリアル化可能なインターフェイスであるか、引数がありません)。コンストラクタ)。したがって、シリアライズ可能なアプローチが機能するには、ライブラリの再コンパイルが必要だと思います。パーセル アプローチでは、オブジェクトのフィールドを何らかの出力に書き込む必要があります。この出力はカスタム オブジェクトをサポートしますが、渡すオブジェクト (ライブラリを含む) が機能するには、シリアライズ可能なインターフェイスを実装する必要があります。

外部ライブラリを使用してインスタンスを渡すための解決策は何ですか?

4

1 に答える 1

0

アプローチの1つは、アクティビティ間で渡したいSerializableではないタイプごとに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で、必要に応じてオブジェクトを逆シリアル化してオブジェクトに戻すことができます。

于 2012-04-26T11:14:39.353 に答える