Intent 传递对象 Serializable/Parcelable

本文介绍了序列化和 Parcelable 在 Android 中的应用,包括如何通过序列化传输对象以及 Parcelable 的实现原理。对比了这两种方法的特点,指出 Parcelable 在效率方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后
的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让
一个类去实现Serializable 这个接口就可以了。

private ArrayList<Users> list  = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    list = new ArrayList<Users>();
    for (int i =0;i<10;i++){
        Users users = new Users();
        users.setName("jarry"+i);
        users.setAge(12+i);
        users.setSex("男");
        list.add(users);
    }
    Intent intent = new Intent(this,NextActivity.class);
    intent.putExtra("users_datas",list);
    startActivity(intent);

NextActivity:

private ArrayList<Users> users = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_next);
    Intent intent = getIntent();
    users = (ArrayList<Users>) intent.getSerializableExtra("users_datas");
    for (int i =0;i<users.size();i++){
        String name = users.get(i).getName();
        int age = users.get(i).getAge();
        String sex = users.get(i).getSex();
        Log.d("NextActivity",name+","+age+","+sex);
    }
}

实体类:

public class Users implements Serializable{
    private String name;
    private int age;
    private String sex;
    。。。。
    }

Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都
是Intent 所支持的数据类型,这样也就实现传递对象的功能了。

Parcelable 的实现方式要稍微复杂一些。可以看到,首先我们让Person 类去实现了
Parcelable 接口,这样就必须重写describeContents()和writeToParcel()这两个方法。其中
describeContents()方法直接返回0 就可以了,而writeToParcel()方法中我们需要调用Parcel
的writeXxx()方法将Person 类中的字段一一写出。注意字符串型数据就调用writeString()方
法,整型数据就调用writeInt()方法,以此类推。
除此之外,我们还必须在Person 类中提供一个名为CREATOR 的常量,这里创建了
Parcelable.Creator 接口的一个实现,并将泛型指定为Person。接着需要重写createFromParcel()
和newArray()这两个方法,在createFromParcel()方法中我们要去读取刚才写出的name 和age
字段,并创建一个Person 对象进行返回,其中name 和age 都是调用Parcel 的readXxx()方法
读取到的,注意这里读取的顺序一定要和刚才写出的顺序完全相同。而newArray()方法中的
实现就简单多了,只需要new 出一个Person 数组,并使用方法中传入的size 作为数组大小
就可以了。
接下来在FirstActivity 中我们仍然可以使用相同的代码来传递Person 对象,只不过在
SecondActivity 中获取对象的时候需要稍加改动,如下所示:
Person person = (Person) getIntent().getParcelableExtra(“person_data”);
注意这里不再是调用getSerializableExtra()方法,而是调用getParcelableExtra()方法来获
取传递过来的对象了,其他的地方都完全相同。
这样我们就把使用Intent 来传递对象的两种实现方式都学习完了,对比一下,Serializable
的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比Parcelable 方式低一
些,所以在通常情况下还是更加推荐使用Parcelable 的方式来实现Intent 传递对象的功能。

public class Users implements Parcelable {
    private String name;
    private int age;
    private String sex;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

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

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

    public static final Parcelable.Creator<Users> CREATOR = new Parcelable.Creator<Users>(){

        @Override
        public Users createFromParcel(Parcel parcel) {
            Users person = new Users();
            person.name = parcel.readString(); // 读取name
            person.age = parcel.readInt();
            person.sex = parcel.readString();
            return person;
        }

        @Override
        public Users[] newArray(int i) {
            return new Users[i];
        }
    };
}

NextActivity:

users = intent.getParcelableArrayListExtra("users_datas");

欢迎关注我Github : @ 我的github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值