【达内课程】Parcelable和Serializable

文章目录

Serializable

Serializable实现序列化的接口

例如:

只要实现这个接口,系统会自动完成序列化,效率较低

public class Music implements Serializable{
	public String title;
	public String artist;
	public int duration;
}

Music music = new Music();
music.title = "";
music.artist = "";
music.duration = 123;
//传递数据
Intent intent = new Intent(this,DetailActivity.class);
intent.putExtra("music",music);
startActivity(intent);
//获取数据
Intent intent = getIntent();
Music music = (Music) intent.getSerializableExtra("music");

Parcelable

而Parcelable是Android系统中的序列化接口,实现该接口的类必须是显示的确定类的成员将如何被序列化

栗子

这个栗子是在【达内课程】Intent在Android系统的作用这篇文章的传递数据的栗子的基础上进行的

在第一个Activity中传递username、age、gender到第二个Activity

我们把要传递的数据封装成一个Person类

Person

public class Person{
    public String username;
    public String gender;
    public int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

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

我们修改刚才的Person类,首先实现Parcelable接口,按照提示,重写方法,并创建CREATOR,需要自己写一个有参的构造方法

public class Person implements Parcelable {
    private String username;
    private String gender;
    private int age;

    protected Person(Parcel in) {
        username = in.readString();
        gender = in.readString();
        age = in.readInt();
    }

	public Person(String username, String gender, int age) {
        this.username = username;
        this.gender = gender;
        this.age = age;
    }

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

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

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

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(username);
        parcel.writeString(gender);
        parcel.writeInt(age);
    }
}

MainActivity传递数据时

		Person person = new Person(username,gender,age);

        Intent intent = new Intent(this,SecondActivity.class);
        intent.putExtra("person",person);
        startActivity(intent);

SecondActivity接收数据时

Person person = getIntent().getParcelableExtra("person");
Log.d("Intent","姓名:"+person.getUsername()+" 性别:"+person.getGender()+" 年龄:"+person.getAge());

总结
Parcelable 是 Android 系统中的序列化接口,实现该接口的类必须显示的确定类的成员将如何被序列化。
实现 Parcelable 接口除了需要重写接口中定义的 2 个抽象方法外,还需要声明 public static final Parcelable.Creator<T> CREATOR 属性,并在创建该属性的对象时,实现 Parcelable.Creator 接口中的 2 个抽象方法。
在实现 Parcelable 接口的过程中,必须保证读写顺序的一致,即先调用 write??? 方法写入数据,一定是先通过 read??? 方法读出来的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值