在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
相关产品推荐
相关产品推荐

