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

如何在Parcelable对象中存储Header类型ArrayList?解决类型未知异常

问题描述

需要向其他Activity传递对象,采用Parcelable方案时遇到异常:非Parcelable类型的对象无法存入Parcelable对象,运行时抛出IllegalArgumentException("Parcel: unknown type for value " + v)。以下是实现代码:

import android.os.Parcel;
import android.os.Parcelable;

import org.apache.http.Header;

import java.util.ArrayList;

public class CustomParcelable implements Parcelable {

    // Extra Header
    private ArrayList<Header> headers = new ArrayList<Header>();

    public CustomParcelable() {}

    public CustomParcelable(ArrayList<Header> headers) {
        this.headers = headers;
    }

    // getter and setter
    //  ...

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeList(headers);
    }

    public static final Creator<CustomParcelable> CREATOR = new Creator<CustomParcelable>() {

        @Override
        public CustomParcelable createFromParcel(Parcel source) {
            ArrayList<Header> headers = new ArrayList<Header>();
            source.readList(headers, null);

            return new CustomParcelable( headers);
        }

        @Override
        public CustomParcelable[] newArray(int size) {
            return new CustomParcelable[size];
        }
    };
}
问题原因

org.apache.http.Header既未实现Parcelable接口,也不是Serializable类型。而Parcel.writeList()方法要求列表元素必须是这两种类型之一,否则无法完成序列化,直接抛出类型未知的异常。

解决方案

通过自定义可Parcelable的包装类,拆解Header的核心属性进行序列化,具体实现如下:

  1. 编写ParcelableHeader包装类,实现Parcelable接口:
import android.os.Parcel;
import android.os.Parcelable;
import org.apache.http.Header;
import org.apache.http.message.BasicHeader;

public class ParcelableHeader implements Parcelable {
    private String name;
    private String value;

    public ParcelableHeader(Header header) {
        this.name = header.getName();
        this.value = header.getValue();
    }

    protected ParcelableHeader(Parcel in) {
        name = in.readString();
        value = in.readString();
    }

    // 将包装类转回原Header对象
    public Header toHeader() {
        return new BasicHeader(name, value);
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(value);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<ParcelableHeader> CREATOR = new Creator<ParcelableHeader>() {
        @Override
        public ParcelableHeader createFromParcel(Parcel in) {
            return new ParcelableHeader(in);
        }

        @Override
        public ParcelableHeader[] newArray(int size) {
            return new ParcelableHeader[size];
        }
    };
}
  1. 修改CustomParcelable的序列化逻辑,转换Header列表为可序列化的包装类列表:
import android.os.Parcel;
import android.os.Parcelable;
import org.apache.http.Header;
import java.util.ArrayList;

public class CustomParcelable implements Parcelable {
    private ArrayList<Header> headers = new ArrayList<>();

    public CustomParcelable() {}

    public CustomParcelable(ArrayList<Header> headers) {
        this.headers = headers;
    }

    // getter and setter
    public ArrayList<Header> getHeaders() {
        return headers;
    }

    public void setHeaders(ArrayList<Header> headers) {
        this.headers = headers;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        ArrayList<ParcelableHeader> parcelableHeaders = new ArrayList<>();
        for (Header header : headers) {
            parcelableHeaders.add(new ParcelableHeader(header));
        }
        dest.writeTypedList(parcelableHeaders);
    }

    public static final Creator<CustomParcelable> CREATOR = new Creator<CustomParcelable>() {
        @Override
        public CustomParcelable createFromParcel(Parcel source) {
            ArrayList<ParcelableHeader> parcelableHeaders = new ArrayList<>();
            source.readTypedList(parcelableHeaders, ParcelableHeader.CREATOR);
            
            ArrayList<Header> headers = new ArrayList<>();
            for (ParcelableHeader ph : parcelableHeaders) {
                headers.add(ph.toHeader());
            }
            return new CustomParcelable(headers);
        }

        @Override
        public CustomParcelable[] newArray(int size) {
            return new CustomParcelable[size];
        }
    };
}
说明

通过包装类将不可序列化的Header转换为Parcelable类型,让Parcel能够正确处理列表的序列化与反序列化,解决类型未知的异常问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:30:57