记:帮助你不会再乱用Serializable和Parcelable

1.什么场景中会使用到Serializable和Parcelable?

答:在进行Intent跳转,需要传递对象到下一个Activity中时候。直接写intent.putExtra()会报错,这时候会提示我们需要将类转换成Serializable和Parcelable

2.你会选择哪个呢?

答:平时我一定选择Serializable。因为它实现很方便,只需要implements Serializable即可(但这是错误的做法,下面会介绍什么情况用哪个)

3.Serializable使用方法:
public class UserBean implements Serializable{
    private int no;
    private String name;
    private String sex;

    public UserBean(int no, String name, String sex) {
        this.no = no;
        this.name = name;
        this.sex = sex;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "UserBean{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}
(1)传递对象

传值部分:

  UserBean userBean=new UserBean(1,"小彩虹","男");
  Intent intent = new Intent(SendActivity.this, SerializableActivity.class);
  intent.putExtra("bean",userBean);
  startActivity(intent);

接收部分:

  Intent intent = getIntent();
  UserBean userBean = (UserBean) intent.getSerializableExtra("bean");
(2)传递集合

传值部分:

  UserBean userBean=new UserBean(1,"小彩虹","男");
  List<UserBean> userBeanList=new ArrayList<UserBean>();
  userBeanList.add(userBean);
  Intent intent = new Intent(SendActivity.this, SerializableActivity.class);
  intent.putExtra("beanList", (Serializable) userBeanList);
  startActivity(intent);

接收部分:

  Intent intent = getIntent();
  List<UserBean> userBeanList = (List<UserBean>) intent.getSerializableExtra("beanList");
4.Parcelable使用方法:
public class StudentBean implements Parcelable {
    private int no;
    private String name;
    private String sex;

  public StudentBean(int no, String name, String sex) {
        this.no = no;
        this.name = name;
        this.sex = sex;
    }

    public StudentBean(Parcel source) {
        //顺序要和writeToParcel方法中顺序一致
        no = source.readInt();
        name = source.readString();
        sex = source.readString();
    }

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

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

    @Override
    public int describeContents() {
        //这里默认返回0即可
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        //顺序要和构造方法中顺序一致
        parcel.writeInt(no);
        parcel.writeString(name);
        parcel.writeString(sex);
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public static Creator<StudentBean> getCREATOR() {
        return CREATOR;
    }

    @Override
    public String toString() {
        return "StudentBean{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}
(1)传递对象

传值部分:

    StudentBean studentBean = new StudentBean(2,"danny","女");

    Intent intent = new Intent(SendActivity.this, ParcelableActivity.class);
    intent.putExtra("bean",studentBean);
    startActivity(intent);

接收部分:

    Intent intent = getIntent();
    StudentBean studentBean = intent.getParcelableExtra("bean");
(2)传递集合

传值部分:

    StudentBean studentBean = new StudentBean(2,"danny","女");
    List<StudentBean> studentBeanList=new ArrayList<StudentBean>();
    studentBeanList.add(studentBean);

    Intent intent = new Intent(SendActivity.this, ParcelableActivity.class);
    intent.putParcelableArrayListExtra("beanList", (ArrayList<? extends Parcelable>) studentBeanList);
    startActivity(intent);

接收部分:

    Intent intent = getIntent();
    List<StudentBean> studentBeanList = intent.getParcelableArrayListExtra("beanList");

如上我们分别实现了Serializable和Parcelable接口


总结篇:

到底为什么要使用序列化

将对象转换成可传输或者可存储的状态。序列化后的对象可以传输或者存储到本地

Serializable的简介

Java自带,原理是将对象转换成可存储或可传输的状态
缺点:
由于使用了反射的原理,序列化的时候会产生大量的临时变量,消耗比较大
优点:
a.打码量少,用起来很方便
b.虽然效率低了点,但是可以保证数据的持久性和稳定性,所以在做存储时,例如存储到文件,还是需要这种方式

Parcelable的简介

将完整对象进行分解,分解后的每个部分都是Intent所支持的数据类型
重写的describeContents(): 内容接口描述,默认返回0即可
重写的writeToParcel():该方法负责序列化,这里注意顺序要和读的顺序保持一致
构造函数:这里相当于反序列化。注意要和写的顺序保持一致。同时会生成一个实例化静态内部对象CREATOR,这里传入了构造函数需要的Parcel

缺点:
a.实现起来较为复杂,增大了代码量
b.只能对内存对象序列化,不能对需要存储在文件或SD等设备进行序列化,如果需要将对象序列化存储到文件,需要使用Serializable
优点:
a.代码编译速度是Serializable的十倍,所以我们需要尽可能使用Parcelable。尤其是在传递集合,集合的泛型实体bean中还嵌套实体bean的情况

在使用场景中,由此可见,大部分情况我们需要使用Parcelable,而存储的时候使用Serializable更好

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容