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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:06:17