【问题标题】:Saving serialized ArrayList throws NotSerializableException in Android在 Android 中保存序列化的 ArrayList 会引发 NotSerializableException
【发布时间】:2016-12-26 09:55:46
【问题描述】:

我想将ArraList<MyClass> 保存到内部存储中。所以,我已经对具有 ArrayList 的类和 MyClass 实现了 Serializable。代码如下所示:

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 扩展了该异常。你能帮帮我吗?

【问题讨论】:

    标签: java android serialization arraylist


    【解决方案1】:

    Context 对象不是Serializable

    由于类TaskItems不是静态的,它可以访问CustomAdapter.thisBaseAdapter对象,其中包含Context对象。

    这就是为什么当您使BaseAdapter 可序列化时,它开始显示 java.io.NotSerializableException: com.something.MainActivity

    Java Doc states

    在遍历图时,可能会遇到不支持Serializable 接口的对象。在这种情况下,NotSerializableException 将被抛出并识别不可序列化对象的类。

    使TaskItems 成为一个静态类,那么它将无法从其静态上下文中访问CustomAdapter.this

    【讨论】:

    • 它有效,但我不明白为什么类 TaskItems 访问 CustomAdapter.this。它没有对上下文的任何引用。
    • class TaskItems 是内部类,因此它可以使用CustomAdapter.this 访问外部类成员变量,通过将TaskItems 类设为静态,我们可以防止访问外部类的成员变量。
    猜你喜欢
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2012-05-09
    • 2013-02-05
    • 2023-03-27
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    相关资源
    最近更新 更多