如何在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的核心属性进行序列化,具体实现如下:
- 编写
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]; } }; }
- 修改
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
相关产品推荐
相关产品推荐

