Android中Serializable和Parcelable的用法及区别

        在Android中我们可以使用Intent的putExtra()方法来对数据进行传递,然后调用相应的getExtra()方法来获取响应数据,但是putExtra()方法所支持的数据类型是有限的,当我们需要传递自定义对象的时候将无从下手,不过不用着急,因为我们可以使用Serializable和Parcelable接口来实现。

1.       Serializable方式的实现

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

首先我们新建一个Person类,然后实现Serializable接口:

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

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

    public int getAge(){
        return age;
    }

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

    public String getName(){
        return name;
    }
}

接下来实现在两个Activity中进行对象的传递:

public class FirstActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Person person=new Person();
        person.setAge(20);
        person.setName("Tom");
        Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
        intent.putExtra("person_data",person);
        startActivity(intent);
    }
}

从SecondActivity中进行数据恢复:

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Person person= (Person) getIntent().getSerializableExtra("person_data");
    }
}

这样我们就通过Serializable接口完成了对象的传递。

2.       Parcelable方式的实现

首先我们来修改一下Person类中的代码: 

public class Person implements Parcelable {
    private int age;
    private String name;

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

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

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

        @Override
        public Person createFromParcel(Parcel source) {
            Person person=new Person();
            person.age=source.readInt();
            person.name=source.readString();
            return person;
        }

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

我们让Person类实现Parcelable接口,然后重写describeContent()和writeToParcel()两个方法。在describeContents()方法中直接返回0即可,writeToParcel()方法中我们需要调用writeXxx()方法写出Person的两个字段。除此之外,我们还需要在Person中提供一个名为CREATOR的常量,创建一个Parcelable.Creator接口的实现,将泛型指定为Person,接着重写createFromParcel()和newArray()两个方法。在createFromParcel()方法中,我们调用readXxx()方法读取在writeToParcel()中的两个字段,注意读取的顺序要和写入的顺序完全相同。最后在newArray()方法中,new出一个Person的数组,并使用传入的size作为数组大小返回即可。

FirstActivity中的代码不需要进行改动,在SecondActivity中我们将方法稍加改动即可:

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Person person= (Person) getIntent().getParcelableExtra("person_data");
    }
}

3.       Serializable和Parcelable方式对比

通过上面两个实现方法我们可以发现Serializable方式实现较为简单。但是在性能方面,Parcelable更具有优势,其内存开销更小,更适合在内存中传递数据,例如Activity之间。而Serializable可将数据持久化保存,所以在需要保存或者网络上传递数据应该使用Serializable。两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值