2012-03-19 40 views
1

我試圖做一個Android應用程序,將存儲窗口小部件(表示爲視圖)在數據庫中,然後能夠稍後重新創建它們。序列化Android視圖 - 從IllegalAccessException導致InvalidClassException

這裏是它的要點:

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

您是否設法解決您的問題? – Odin 2014-02-23 09:33:36

回答

5

僅僅因爲基類有一個無參數的構造函數,並不意味着這個子類會。 TextView沒有,也沒有做大多數其他意見。

序列化在其整體的View後來取回它似乎並不像一個好主意,因爲View有一個背景,它可能已經在時間與您提交的序列化版本被破壞的時間您檢索。

也許你可以在Parcel中只存儲你需要的數據,然後用它來獲得一個字節數組,然後你可以把它作爲一個blob存儲在你的數據庫中。很可能,您可能會發現這種方法與onSaveInstanceState()方法結合使用。

相關問題