Android中Intent传递对象的3种方式详解(Serializable、Parcelable、JSON)

Serializable、Parcelable区别

1、作用

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

从上面的设计上我们就可以看出优劣了。

 

2、效率及选择

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

 

3、编程实现

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

Parcelable的一个实现例子如下

实现代码如下:

1)SerializableBan:

public class PersonSer_serializablebean implements Serializable {
    private String name;

    private int age;

    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;
    }
}
2)ParcelableBean:

public class PersonSer_parcelablebean implements Parcelable{
    private String name;

    private int age;

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        //该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,
        // 以便从parcel容器获取数据
        dest.writeString(name);
        dest.writeInt(age);
    }

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

    public static final Creator CREATOR = new
            Creator() {
        @Override
        public PersonSer_parcelablebean createFromParcel(Parcel in) {
            //从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。
            PersonSer_parcelablebean parcelablebean = new PersonSer_parcelablebean();
            parcelablebean.name=in.readString();
            parcelablebean.age=in.readInt();
            return parcelablebean;
        }

        @Override
        public PersonSer_parcelablebean[] newArray(int size) {
            //创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。
            return new PersonSer_parcelablebean[size];
        }
    };

    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;
    }


}
3)JsonBean:

public class PersonSer_Jsonbean{
    private String name;

    private int age;

    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;
    }
}

activity中:

发送部分

public static final String SER_TYPE="1" ;
public static final String SER_KEY="1" ;
public static final String PAR_TYPE="2";
public static final String PAR_KEY="2";
public static final String JSON_TYPE="3";

//  Intent数据传递方式Serializable、Parcelable、json
Intent intent = new Intent(this,DataTransferActivity.class);
Bundle bundle = new Bundle();
switch (item.getItemId()) {
    case R.id.Serializable:
        // Serializable传递对象
        PersonSer_serializablebean personSer_serializablebean = new PersonSer_serializablebean();
        personSer_serializablebean.setName("liusheng");
        personSer_serializablebean.setAge(18);
        bundle.putSerializable(SER_KEY,personSer_serializablebean);
        intent.putExtra("type", SER_TYPE);
        intent.putExtras(bundle);
        startActivity(intent);
        break;
    case R.id.Parcelable:
        // Parcelable传递对象
        PersonSer_parcelablebean personSerParcelablebean = new PersonSer_parcelablebean();
        personSerParcelablebean.setName("panxingxing");
        personSerParcelablebean.setAge(18);
        bundle.putParcelable(PAR_KEY,personSerParcelablebean);
        intent.putExtra("type",PAR_TYPE);
        intent.putExtras(bundle);
        startActivity(intent);
        break;
    case json:
        //JSON传递对象
        PersonSer_serializablebean personSerSerializablebean = new PersonSer_serializablebean();
        personSerSerializablebean.setName("bingbing");
        personSerSerializablebean.setAge(18);
        intent.putExtra("person",new Gson().toJson(personSerSerializablebean));
        intent.putExtra("type",JSON_TYPE);
        startActivity(intent);
        break;
}
接收部分

String type = getIntent().getStringExtra("type");
// 根据type判断是哪种类型
if (type.equals(brandActivity.SER_TYPE)) {
    PersonSer_serializablebean personSer_serializablebean = (PersonSer_serializablebean)
            getIntent().getSerializableExtra(brandActivity.SER_KEY);
    readName.setText(personSer_serializablebean.getName());
    readAge.setText(String.valueOf(personSer_serializablebean.getAge()));
}else if(type.equals(brandActivity.PAR_TYPE)){
    PersonSer_parcelablebean parcelablebean = getIntent().getParcelableExtra(brandActivity.PAR_KEY);
    readName.setText(parcelablebean.getName());
    readAge.setText(String.valueOf(parcelablebean.getAge()));
}else{
    String personJson=getIntent().getStringExtra("person");
    PersonSer_serializablebean personSerSerializablebean=new Gson().fromJson(personJson,PersonSer_serializablebean.class);
    readName.setText(personSerSerializablebean.getName());
    readAge.setText(String.valueOf(personSerSerializablebean.getAge()));
}


你可能感兴趣的:(Android中Intent传递对象的3种方式详解(Serializable、Parcelable、JSON))