2

ウィジェット (ビューとして表される) をデータベースに格納し、後でそれらを再作成できるようにする Android アプリを作成しようとしています。

その要点は次のとおりです。

public class DBSerializer<T extends View & Serializable> {

public int storeWidget(T widget) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(bytes);
    out.writeObject(widget);
    byte[] data = bytes.toByteArray();
    bytes.close();
    out.close();
    <store "data" in database>;
    return <unique database id>;
}

public T getWidget(int id) {
    byte[] data = <get data from database for the given id>;
    ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(data));
    return (T)in.readObject();
}

}

残念ながら、in.readObject()はメッセージとともに InvalidClassException をスローしますandroid.view.View; IllegalAccessException

Android の View は Object を直接拡張し、Object には引数のないコンストラクタがあるため、これは機能しないのでしょうか? または、引数なしのコンストラクターで View を呼び出そうとしていますか? エラーメッセージは、例外の正確な原因が何であるかについてあまり明確ではありません.

誰がこれを引き起こしているのか、それを修正する方法を知っていますか?

4

1 に答える 1

7

基本クラスにパラメーターなしのコンストラクターがあるからといって、サブクラスがそうであるとは限りません。TextViewはそうではなく、他のほとんどのビューもそうではありません。

a を完全にシリアライズしViewて後で取得することは、良い考えとは思えません。なぜなら、 aViewにはコンテキストがあり、シリアライズされたバージョンをコミットしてから取得するまでの間に破棄された可能性があるからです。

おそらく、必要なデータのみをParcelに格納し、それを使用してバイト配列を取得し、それをデータベースに blob として格納できます。おそらく、このアプローチはonSaveInstanceState()メソッドと組み合わせて使用​​すると便利です。

于 2012-03-19T23:37:13.783 に答える