2016-08-19 36 views
0

我想將ArraList<MyClass>保存到內部存儲。所以,我已經將Serializable實現爲具有ArrayList和MyClass的類。代碼如下所示:在Android中保存序列化ArrayList拋出NotSerializableException

public class CustomAdapter extends BaseAdapter implements Serializable { 
public ArrayList<TaskItems> taskList = new ArrayList<TaskItems>(); 
// some fields and variables 
// some methods which use below method saveFile() 
public void saveFile() { 
    try { 
     String filename = "daytodaytasks"; 
     FileOutputStream fileOutputStream = mContext.openFileOutput(filename, Context.MODE_PRIVATE); 
//mContext is MainActivity context 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 
     objectOutputStream.writeObject(taskList); 
     objectOutputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
class TaskItems implements Serializable { 
    String smallRectUpText; 
    String smallRectDownText; 
    String bigRectText; 
    } 
} 

在類CustomAdapter中有使用saveFile()方法的方法。所有的方法都是使用類引用從MainActivity onClick()方法中調用的。當我運行該程序,並按下按鈕,可以使用的onClick方法獲得:

java.io.NotSerializableException: com.something.MainActivity 

於是,我就實現Serializable到MainActivity,但後來我從AppCompatAcitvity相同的異常,這MainActivity延伸。你可以幫幫我嗎 ?

回答

1

Context物體不是Serializable

由於TaskItems類不是靜態的,它可以訪問CustomAdapter.this,即BaseAdapter對象,其中包含Context對象。

這就是爲什麼當你讓BaseAdapter序列化的,它開始呈現出 java.io.NotSerializableException: com.something.MainActivity

Java Doc states

當遍歷一個圖形,對象,可能會遇到不支持的Serializable接口。在這種情況下,NotSerializableException將被拋出並將識別不可序列化的對象的類。

使TaskItems成爲一個靜態類,那麼它將無法從其靜態上下文中訪問CustomAdapter.this

+0

它的工作原理,但我不明白爲什麼類TaskItems訪問CustomAdapter.this。它沒有任何參考上下文。 – Michal

+0

class TaskItems是內部類,因此它可以使用CustomAdapter.this訪問外部類成員變量,通過使類TaskItems成爲靜態,我們阻止外部類的成員變量的訪問。 – Raman

相關問題