序列化Android视图 - 导致IllegalAccessException出现InvalidClassException

时间:2012-03-19 23:28:05

标签: android database serialization view illegalaccessexception

我正在尝试创建一个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()抛出了一个带有消息android.view.View; IllegalAccessException的InvalidClassException。

由于Android的View直接扩展了Object,而Object有一个无参数的构造函数,所以不应该这样吗?或者它是否尝试使用无参数构造函数调用View?错误消息并不十分清楚异常的确切原因是什么。

有谁知道造成这种情况的原因以及如何解决?

1 个答案:

答案 0 :(得分:7)

仅仅因为基类具有无参数构造函数,这并不意味着子类会。 TextView没有,大多数其他观点也没有。

完整地序列化View并稍后检索它似乎不是一个好主意,因为View有一个上下文,可能在您提交序列化之间的时间内被销毁版本和检索它的时间。

也许您只能在Parcel中存储所需的数据,并使用它来获取字节数组,然后您可以将其作为blob存储在数据库中。有可能,您可能会发现此方法与onSaveInstanceState()方法一起使用非常有用。