浅谈Serializable与Parcelable

Android中使用Intent来启动Android的组件,而且在启动Android中的组件的时候可以使用Intent携带并传递数据。如:

       Intent intent=new Intent(MainActivity.this,AnotherActivity.class);
        intent.putExtra("per_age",20);
        startActivity(intent);

但是当使用Intent的putExtra()方法来传递数据的时候,只能传递基本类型的数据,无法传递对象类型的数据。为了保证Intent可以传递对象类型的数据我们可以采取两种方式,实体类实现Serializable接口和实体类实现Parcelable接口。
Serializable方式:
Serializable方式指的是序列化方式,而 Java的对象序列化是指将那些实现了Serializable接口的对象转换成一个字符序列,并能够在以后将这个字节序列完全恢复为原来的对象。
Serializable是一个声明式的接口,没有任何需要实现的抽象方法,因此当需要将对象序列化的时候,只需要实体类简单的实现一下接口就行。

/**
 * Created by BeautifulSoup on 2017/2/9.
 */

public class Person implements Serializable{
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

实际操作:

        Person person=new Person("BeautifulSoup",20);
        Intent intent=new Intent(MainActivity.this,AnotherActivity.class);
        intent.putExtra("per",person);
        startActivity(intent);

在目标Activity中得到传递的数据:

Person person=(Person)getIntent().getParcelableExtra("per");

此种方式十分简单,但是效率不高,因此实际操作中我们通常使用Parcelable方式。

Parcelable方式:
Parcelable方式的原理是将一个完整的对象进行分解,从而将完整的对象分解成intent可以传递的基本类型的数据。
基本使用的方式就是实体类实现Parcelable接口,重写接口未实现的方法。
其中describeContents方法的返回值一般是0,writeToParcel方法中将对象中的数据写出。
此外,我们还需要在实体类中提供一个CREATOR的常量。在匿名类中将写出的字段依次的读入即可。

/**
 * Created by BeautifulSoup on 2017/2/9.
 */
public class User implements Parcelable {

    private String name;
    private Integer age;
    private String address;
    private String phone;

    protected User() {
    }

    public User(String name, Integer age, String address, String phone) {
        this.name = name;
        this.age = age;
        this.address = address;
        this.phone = phone;
    }

    //省略getter与setter...

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            User user=new User();
            user.name=in.readString();
            user.age=in.readInt();
            user.address=in.readString();
            user.phone=in.readString();
            return user;
        }

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

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(name);
        parcel.writeInt(age.intValue());
        parcel.writeString(address);
        parcel.writeString(phone);
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}
        User user=new User("BeautifulSoup",20,"山东","17811111111");
        Intent intent=new Intent(MainActivity.this,AnotherActivity.class);
        intent.putExtra("user",user);
        startActivity(intent);

在目标Activity中得到传递的数据:

User user=(User)getIntent().getParcelableExtra("user");
发布了123 篇原创文章 · 获赞 47 · 访问量 14万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章