实现Parcelable接口,Writing a list of parcelable objects to a parcelable object

问题回答参考:http://stackoverflow.com/questions/19955482/writing-a-list-of-parcelable-objects-to-a-parcelable-object
关于Parcelable转自简书博客:http://www.jianshu.com/p/b1fcff2728bd

什么是Parcelable接口

作用:给类设计的接口,类一旦实现这个接口,该类的对象即可进行一个“从对象存储为Parcel , 从Parcel读取为对象”的一个读写过程。
目的:实现序列化
原因:
序列化,为了:
1) 永久保存对象,保存对象的字节到本地文件中
2) 通过序列化对象在网络中传递对象
3) 通过序列化在进程间传递对象
与Serializable对比:
1)在使用Intent传递数据时:

Serializable: Bundle.putSerializable(Key, 实现了Serializable的对象);
Parcelable: Bundle.putParcelable(Key, 实现了Parcelable的对象);
2)内存使用性能上:

Parcelable > Serializable
由于Serializable在序列化时会产生大量的临时变量,从而引起频繁的GC。
3)数据存储在磁盘上的情况:

Serialzable > Parcelable
Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable
支持的成员数据类型:
1) 普通数据类型【如:int、double等以及他们的封装类如Integer、Float等】以及他们的数组类型【如:int[]、double[]等】注意:不支持:List[Integer]类型等List类型
2) String/CharSequence及其数组String[]、ArrayList[String]
3) Bundle 和 List
4) Serializable 注意:不支持List
5) Binder 和 List ,IBinder 和 List
6) Parcelable实现类
重温:Intent/Bundle传递支持的数据类型有:

基本数据类型和它的数组类型
String/CharSequence和它的数组类型
Serializable
Parcelable

而至于List<实体类> xxx如何读写,见下面代码片段,Cast和Avatars类都实现了Parcelable类,略过。

package com.helin.rxsample.enity;

import android.annotation.SuppressLint;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by liukun on 16/3/5.
 */
@SuppressLint("ParcelCreator")
public class Subject implements Parcelable{

    private String id;
    private String alt;
    private String year;
    private String title;
    private String original_title;
    private List<String> genres;
    private List<Cast> casts = new ArrayList<>();
    private List<Cast> directors = new ArrayList<>();
    private Avatars images;


    @Override
    public String toString() {
        return "Subject.id=" + id
                + " Subject.title=" + title
                + " Subject.year=" + year
                + " Subject.originalTitle=" + original_title + casts.toString() + directors.toString() + " | ";
    }

    public String getId() {
        return id;
    }

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

    public String getAlt() {
        return alt;
    }

    public void setAlt(String alt) {
        this.alt = alt;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getOriginal_title() {
        return original_title;
    }

    public void setOriginal_title(String original_title) {
        this.original_title = original_title;
    }

    public List<String> getGenres() {
        return genres;
    }

    public void setGenres(List<String> genres) {
        this.genres = genres;
    }

    public List<Cast> getCasts() {
        return casts;
    }

    public void setCasts(List<Cast> casts) {
        this.casts = casts;
    }

    public List<Cast> getDirectors() {
        return directors;
    }

    public void setDirectors(List<Cast> directors) {
        this.directors = directors;
    }

    public Avatars getImages() {
        return images;
    }

    public void setImages(Avatars images) {
        this.images = images;
    }

    protected Subject(Parcel in){
         id = in.readString();
        alt = in.readString();
        year = in.readString();
        title = in.readString();
        original_title = in.readString();
        genres = in.createStringArrayList();
//        in.readList(casts,casts.getClass().getClassLoader());
//        in.readList(directors,directors.getClass().getClassLoader());
        **in.readTypedList(casts,Cast.CREATOR);
        in.readTypedList(directors,Cast.CREATOR);**
        images = in.readParcelable(images.getClass().getClassLoader());
    }

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

    /* private String id;
    private String alt;
    private String year;
    private String title;
    private String original_title;
    private List<String> genres;
    private List<Cast> casts;
    private List<Cast> directors;
    private Avatars images;*/
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.id);
        dest.writeString(this.alt);
        dest.writeString(this.year);
        dest.writeString(this.title);
        dest.writeString(this.original_title);
        dest.writeStringList(this.genres);
//        dest.writeList(this.casts);
//        dest.writeList(this.directors);
        **dest.writeTypedList(casts);
        dest.writeTypedList(directors);**
        dest.writeParcelable(this.images,flags);
    }

    public static final Parcelable.Creator<Subject> CREATOR = new Parcelable.Creator<Subject>(){

        @Override
        public Subject createFromParcel(Parcel source) {
            return new Subject(source);
        }

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






}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值