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

Das*_*tor 2 database serialization android 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();
}

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,in.readObject()抛出带有消息的InvalidClassException android.view.View; IllegalAccessException.

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

有谁知道是什么导致了这个以及如何解决它?

wsa*_*lle 7

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

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

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