You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Activity间传递自定义对象时遭遇java.io.NotSerializableException异常

解决Android Serializable传递对象时的java.io.NotSerializableException异常

嘿,这个坑我踩过!你已经给WelcomeActivity和QuestionRepository都实现了Serializable接口,但还是抛出这个异常,90%的情况是你的QuestionRepository内部包含了没有实现Serializable的成员变量,这是序列化最容易忽略的点!

我给你梳理下排查和解决的步骤:

1. 检查所有成员变量的序列化实现

序列化是递归的——如果你的QuestionRepository里有自定义对象(比如Question类、某个实体类)、甚至是集合里的泛型对象,这些类必须全部实现Serializable接口。举个例子:

// 必须确保Question类也实现Serializable
public class Question implements Serializable {
    private String questionContent;
    private List<String> options;
    // 构造方法、getter/setter...
}

public class QuestionRepository implements Serializable {
    // 显式声明serialVersionUID可以避免类结构变化导致的反序列化失败
    private static final long serialVersionUID = 1L;
    private List<Question> questionList;
    private int category;
    // ...其他字段
}

如果某个成员变量是第三方库的类(没法修改源码实现Serializable),可以用transient关键字标记它,序列化时会跳过这个字段:

public class QuestionRepository implements Serializable {
    private static final long serialVersionUID = 1L;
    // 标记这个字段不参与序列化
    private transient OkHttpClient httpClient;
    private List<Question> questionList;

    // 反序列化后手动初始化transient字段
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        // 在这里重新初始化httpClient
        httpClient = new OkHttpClient.Builder().build();
    }
}

2. 修正拼写错误!

看你的代码里,传递时用的是"qustionRepository"(少了一个字母e),但获取时写的是"question...",这种拼写不一致会导致获取不到对象,虽然不是直接引发异常的原因,但也是个致命bug,赶紧修正:

// WelcomeActivity中修正key的拼写
Intent intent = new Intent(WelcomeActivity.this, QuestionActivity.class);
intent.putExtra("category", 1);
intent.putExtra("questionRepository", questionRepository); // 这里把qustion改成question
startActivity(intent);

// QuestionActivity中正确获取
QuestionRepository questionRepository = (QuestionRepository) getIntent().getSerializableExtra("questionRepository");

3. 可选:改用Android推荐的Parcelable

如果你的对象比较复杂或者追求性能,建议用Parcelable接口——这是Android原生推荐的序列化方式,比Serializable更高效。不过实现起来需要写一些模板代码,现在很多IDE(比如Android Studio)可以自动生成Parcelable的实现代码。

内容的提问来源于stack exchange,提问作者JollyRoger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:03:18