美文网首页
记:帮助你不会再乱用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