android:--Serializable和Parcelable两种序列化

来源:互联网 发布:js方法传递对象参数 编辑:程序博客网 时间:2024/06/08 01:23

putExtra(String name, Parcelable value)//传递一个parcelable对象 

putExtra(String name, Parcelable[] value) // 传递一个Parcelable数组

putExtra(String name, Bundle value) //传递一个Bundle对象

putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value) //传递一个实现Parcelable接口的对象数组

putStringArrayListExtra(String name, ArrayList<String> value) //传递一个字符串数组

putIntegerArrayListExtra(String name, ArrayList<Integer> value) //传递一个整形数组。

Integer这些装箱类型,Intent还实现了 putExtra(String name, int[] value) 这样的基础类型数组,同时Parcelable效率比标准的Java序列化更高,同时还被用作在AIDL中交换数据,所以掌握Parcelable这样的显示序列化技术,可以大幅提高数据交换性能。

1、作用

Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而AndroidParcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。 

2、效率及选择

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

 

3、编程实现

对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。而Parcelable则需要实现writeToParceldescribeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。

Parcelable的一个实现例子如下

package com.jirrui.edu.entry;import android.os.Parcel;import android.os.Parcelable;public class Student implements Parcelable {private String stuno;private String name;public String getStuno() {return stuno;}public void setStuno(String stuno) {this.stuno = stuno;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int arg1) {dest.writeString(this.stuno);dest.writeString(this.name);}public static final Parcelable.Creator<Student> CREATOR=new Creator<Student>(){@Overridepublic Student createFromParcel(Parcel source) {Student stu=new Student();stu.setStuno(source.readString());stu.setName(source.readString());return stu;}@Overridepublic Student[] newArray(int arg0) {return new Student[arg0];}};}


0 0