2016-08-19 82 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