美文网首页
记:帮助你不会再乱用Serializable和Parcelabl

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

作者: 爱吃板栗的小女孩 | 来源:发表于2018-12-03 13:51 被阅读344次
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更好

相关文章

网友评论

      本文标题:记:帮助你不会再乱用Serializable和Parcelabl

      本文链接:https://www.haomeiwen.com/subject/dptycqtx.html