Android序列化之谈谈serializable和parcelable

一、定义

  • 实现serializable是java原生的序列化的方式
  • parcelable是Android上特有的用于将对象序列化的一个接口

二、为什么要使用序列化呢

1、在我们平时的开发中,少不了在组件间以及不同界面中传递数据,对于复杂数据类型,比如对象我们需要将其序列化来达到可存储可传输的目的

三、实践两种序列化方法传递对象

1、实现Serializable接口序列化对象

实现Serializable接口的Student类

public class Student implements Serializable{

    private String name;
    private int age;

    public Student() {
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

}

使用intent传递对象

Student student = new Student();
student.setAge(18);
student.setName("张三");
intent.putExtra("student", student);

从intent中得到student对象

Intent intent = getIntent();
Student student = (Student) intent.getSerializableExtra("student");

2、实现parcelable接口序列化

实现Parcelable的student类

public class Student implements Parcelable{

    private String name;
    private int age;

    public Student() {
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    /** ---------------------Parcelable need--------------------------- */
    protected Student(Parcel in) {
        age = in.readInt();
        name = in.readString();
    }

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

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

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(age);
        dest.writeString(name);
    }
}

intent传递

Student student = new Student();
student.setAge(18);
student.setName("张三");
intent.putExtra("student", student);

在SecondActivity中

Intent intent = getIntent();
Student student = intent.getParcelableExtra("student");

四、总结

系统自动帮我们做了需要的操作

  1. 主要是readXXX()方法读取;
  2. writeXXX()方法写入;
  3. 两种方式都可以将对象序列化后传递 但是在Android中建议使用 Parcelable对对象进行序列化
    它的效率是serializable的十倍以上;因为serializable在序列化的过程中使用到了反射,这是很耗时的,并且会产生很多的临时变量,这将导致频繁GC;而parcelable实质上是将对象分解进行传递,分解后的每一部分都是intent所支持的普通数据类型;
  4. 如果需要将对象进行持久化存储,建议使用serializable,即使效率要低;因为parcelable在外界有变化的情况下不能保证数据的的持续性;
  5. 比起serializable,parcelable使用要麻烦些 代码量会更多,但这并不影响我们使用它,毕竟效率杠杠的。

你可能感兴趣的:(Android序列化之谈谈serializable和parcelable)