Intent传递对象(java与Android两种序列化方式)

Intent传递对象

传递单个对象:

序列化:就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

将一个类对象转换成可存储、可传输状态的过程

对象需要序列化,有两种序列化方式,java的和安卓的

java方式:Serializable

public class Student implements Serializable {
Student student = new Student();
student.setId(10010);
student.setName("传音");
student.setSchool("哈哈哈");
intent.putExtra("stu",student);
Student student = (Student) intent.getSerializableExtra("stu");
Log.d("xssssddd",student.toString()+"");

安卓的序列化:Parcelable

P是Android SDK API,其序列化操作完全由底层实现,可以在进程内、进程间(AIDL)高效传输数据。不同版本的API实现方式可能不同,不宜做本地持久化存储。

class PeopleS implements Parcelable 
public class PeopleS implements Parcelable {
    private int id;
    private String name;

    protected PeopleS(Parcel in) {
        id = in.readInt();
        name = in.readString();
    }
    public PeopleS( String name, int id) {
        this.name = name;
        this.id = id;
    }
    public PeopleS(){

    }
    /**
     * 反序列化
     */
    public static final Creator<PeopleS> CREATOR = new Creator<PeopleS>() {
        /**
         * 从序列化对象中创建原始对象
         */
        @Override
        public PeopleS createFromParcel(Parcel in) {
            return new PeopleS(in);
        }

        /**
         * 创建指定长度的原始对象数组
         */
        @Override
        public PeopleS[] newArray(int size) {
            return new PeopleS[size];
        }
    };

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "PeopleS{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
    /**
     * 当前对象的内容描述,存在文件描述符时返回1  其余全返回0
     */
    @Override
    public int describeContents() {
        return 0;
    }
    /**
     * 序列化:将当前对象写入序列化结构中
     */
    @Override
    public void writeToParcel(Parcel parcel, int i) {
          parcel.writeInt(id);
          parcel.writeString(name);
    }

}

2、效率及选择
Serializable是Java中的序列化接口,其使用起来简单但开销较大(因为Serializable在序列化过程中使 用了反射机制,故而会产生大量的临时变量,从而导致频繁的GC),并且在读写数据过程中,它是通 过IO流的形式将数据写入到硬盘或者传输到网络上。Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据。而Serializable可将数据持久化方便保存,Parcelable不能很好的保证数据的持续性,使用相对复杂,所以在需要保存或网络传输数据时选择Serializable。

Serializable使用了反射技术,并且期间产生临时对象

Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化

一组对象传输:

Serializable

for(int i = 0; i < 5; i++){
    Student student1 = new Student();
    student1.setId(i);
    student1.setName("xxx"+i);
    student1.setSchool("ooo"+i);
    students.add(student1);
}
intent.putExtra("students",(Serializable) students);
List<Student> students = (List<Student>) intent.getSerializableExtra("students");
Log.d("xssssddd",students.toString());

Parcelable

List<PeopleS> peopleSs = new ArrayList<>();
for(int i = 0; i < 5; i++){
    PeopleS peopleS1 = new PeopleS();
    peopleS1.setName("psssssssd"+i);
    peopleS1.setId(i);
    peopleSs.add(peopleS1);
}
intent.putParcelableArrayListExtra("peopleSs", (ArrayList<? extends Parcelable>) peopleSs);
List<PeopleS> peopleSs = (List<PeopleS>) intent.getSerializableExtra("peopleSs");
Log.d("xssssddd",peopleSs.toString());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值