我正在尝试创建一个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?错误消息并不十分清楚异常的确切原因是什么。
有谁知道造成这种情况的原因以及如何解决?
答案 0 :(得分:7)
仅仅因为基类具有无参数构造函数,这并不意味着子类会。 TextView没有,大多数其他观点也没有。
完整地序列化View
并稍后检索它似乎不是一个好主意,因为View
有一个上下文,可能在您提交序列化之间的时间内被销毁版本和检索它的时间。
也许您只能在Parcel中存储所需的数据,并使用它来获取字节数组,然后您可以将其作为blob存储在数据库中。有可能,您可能会发现此方法与onSaveInstanceState()方法一起使用非常有用。