Android Parcelable 嵌套readParcelable

本文详细探讨了在Android中如何实现Parcelable接口进行数据序列化,特别是如何处理Parcelable对象的嵌套读写操作。通过实例分析,揭示了如何在Parcelable类中正确地调用readParcelable和writeParcelable方法,以便在不同组件间高效传递复杂数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于Android的自定义对象进行序列化,一般会选择Parcelable,或者Serializable。
在Android中,由于在使用内存时,Parcelable类要比Serializable类的性能要高;
并且Serializable在序列化的时候会产生大量的临时变量,从而会引起频繁的GC,因此在Android开发中,会推荐使用Parcelable进行序列化。


在序列化时,碰到Parcelabe类中,嵌套Parcelabe类,会稍微有点不一样。

如下:

public class FacialPart implements Parcelable {

    private int id;
    private float scale = 1.0f;
    private float tx;
    private float ty;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public float getScale() {
        return scale;
    }

    public void setScale(float scale) {
        
        this.scale = scale;
    }

    public float getTx() {
        return tx;
    }

    public void setTx(float tx) {
        this.tx = tx;
    }

    public float getTy() {
        return ty;
    }

    public void setTy(float ty) {
        this.ty = ty;
    }

    public FacialPart() {
        this(0);
    }
    
    public FacialPart(int id) {
        this.id = id;
    }
    

    @Override
    public String toString() {

        return "FacialPart[id=" + id + ", scale=" + scale + ", tx=" + tx + ", ty=" + ty + "]";
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flag) {
        
        dest.writeInt(id);
        dest.writeFloat(scale);
        dest.writeFloat(tx);
        dest.writeFloat(ty);
    }
    
    public static final Parcelable.Creator<FacialPart> CREATOR = new Parcelable.Creator<FacialPart>() {

        @Override
        public FacialPart createFromParcel(Parcel in) {

            int id = in.readInt();
            float s = in.readFloat();
            float tx = in.readFloat();
            float ty = in.readFloat();
            
            FacialPart part = new FacialPart(id);
            part.setScale(s);
            part.setTx(tx);
            part.setTy(ty);
            
            return part;
        }

        @Override
        public FacialPart[] newArray(int size) {
            
            return new FacialPart[size];
        }
    };
}

public class DetectedFace  implements Parcelable {

    private FacialPart facePart;
    private FacialPart nosePart;
    private FacialPart eyePart;
    private FacialPart eyebrowPart;
    private FacialPart mouthPart;
    
    private List<FacialPart> parts;

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

    @Override
    public void writeToParcel(Parcel dest, int flag) {

        dest.writeParcelable(facePart, flag);
        dest.writeParcelable(nosePart, flag);
        dest.writeParcelable(eyePart, flag);
        dest.writeParcelable(eyebrowPart, flag);
        dest.writeParcelable(mouthPart, flag);

	dest.writeTypedList(parts);  
    }
    
    public static final Parcelable.Creator<DetectedFace> CREATOR = new Parcelable.Creator<DetectedFace>() {

        @Override
        public DetectedFace createFromParcel(Parcel in) {
            
            
            
            FacialPart facePart = in.readParcelable(FacialPart.class.getClassLoader());
            FacialPart nosePart = in.readParcelable(FacialPart.class.getClassLoader());
            FacialPart eyePart = in.readParcelable(FacialPart.class.getClassLoader());
            FacialPart eyebrowPart = in.readParcelable(FacialPart.class.getClassLoader());
            FacialPart mouthPart= in.readParcelable(FacialPart.class.getClassLoader());
            
	    List<FacialPart> parts = new ArrayList<FacialPart>();  
	    in.readTypedList(parts, FacialPart.CREATOR);  

            DetectedFace face = new DetectedFace();

            face.facePart = facePart;
            face.nosePart = nosePart;
            face.eyePart = eyePart;
            face.eyebrowPart = eyebrowPart;
            face.mouthPart = mouthPart;
	    
	    face.parts = parts;
            
            return face;
        }

        @Override
        public DetectedFace[] newArray(int size) {
            return new DetectedFace[size];
        }  
        
    };
}

关键的代码就是读取时,使用**.class.getClassLoader()进行读取;
如:
FacialPart facePart = in.readParcelable(FacialPart.class.getClassLoader());

而对于嵌套的列表,则使用如下代码:
List<FacialPart> parts = new ArrayList<FacialPart>();  
in.readTypedList(parts, FacialPart.CREATOR);  



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值