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 和 message 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 回答