Activity恢复savedInstanceState时出现Parcel解包未知类型代码错误求助
解决Parcelable反序列化时的Unknown Type Code错误
这个问题我之前排查过好几次,核心原因就是你的SimiData类里的HashMap在Parcelable的序列化/反序列化流程中出现了不兼容情况,具体可以从这几个方面排查修复:
1. 检查HashMap的键值类型是否合法
Parcelable只支持序列化基本数据类型、String、实现Parcelable的自定义类、Serializable类,如果你的HashMap里存了既不是Parcelable也不是Serializable的自定义对象,就会触发这个错误:
- 先确认HashMap的Key和Value都是上述合法类型;
- 如果有自定义类作为键值,务必确保它正确实现了Parcelable(或Serializable)接口。
2. 严格保证序列化和反序列化的顺序一致
Parcelable的读写完全依赖顺序,writeToParcel里写数据的顺序,必须和createFromParcel里读数据的顺序完全对应,包括HashMap的读写位置,哪怕只是调换了两个字段的读写顺序,都可能引发类型解析错误。
3. 正确读写HashMap的方式
很多人在这里踩坑,正确的HashMap读写姿势应该是这样的:
序列化(writeToParcel方法)
@Override public void writeToParcel(Parcel dest, int flags) { // 先写其他字段,再写HashMap,顺序要和读的时候一致 dest.writeMap(yourHashMap); }
反序列化(Parcel构造函数)
protected SimiData(Parcel in) { // 读的顺序必须和写的顺序完全匹配 yourHashMap = in.readHashMap(SimiData.class.getClassLoader()); }
注意:readHashMap必须传入正确的类加载器,否则会无法正确解析HashMap里的自定义类型。
4. 添加版本兼容(可选但推荐)
如果你的SimiData类后续有字段修改,建议添加版本号来兼容旧的Parcel数据,避免版本迭代后出现解析错误:
public class SimiData implements Parcelable { private static final int VERSION = 1; private HashMap<String, Object> yourHashMap; public static final Creator<SimiData> CREATOR = new Creator<SimiData>() { @Override public SimiData createFromParcel(Parcel in) { return new SimiData(in); } @Override public SimiData[] newArray(int size) { return new SimiData[size]; } }; public SimiData() { yourHashMap = new HashMap<>(); } protected SimiData(Parcel in) { // 先读版本号 int version = in.readInt(); yourHashMap = in.readHashMap(SimiData.class.getClassLoader()); } @Override public void writeToParcel(Parcel dest, int flags) { // 先写版本号 dest.writeInt(VERSION); dest.writeMap(yourHashMap); } @Override public int describeContents() { return 0; } }
5. 验证Fragment间的数据传递逻辑
确保你在Fragment间传递SimiData时,是通过标准的Bundle方式,恢复状态时也正确从Bundle中取出:
// 传递数据 Bundle bundle = new Bundle(); bundle.putParcelable("simi_data", simiData); fragment.setArguments(bundle); // 恢复数据 if (getArguments() != null) { simiData = getArguments().getParcelable("simi_data"); }
按照以上步骤排查,基本就能解决这个Unmarshalling的类型错误了。
内容的提问来源于stack exchange,提问作者Glenn
相关产品推荐
相关产品推荐

