Android那点事-系列之(一)Parcelable和Serializable的区别与使用

大家好,我是Bin,今天为大家分享一下Android中ParcelableSerializable的区别与使用。
大家都知道,这两个都是和序列化相关的接口,那么我先带大家普及一下有关序列化的基础知识。
一、序列化、反序列化是什么?
对象的序列化:Java对象转化 为字节流的过程;
对象的反序列化:字节流转化为Java对象的过程。
二、序列化的作用是什么?
Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种
传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效
存中存在,Parcelable是通过IBinder通信的消息的载体。
三、两者的区别是什么?
由于Parcelable是在内存中操作数据而Serializable是在硬盘中进行IO操作,显然Parcelable效率要高
,占用内存小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据;而Serializable
可将数据持久化保存,所以在需要保存或网络传输数据时选择Serializable。
Android两个Activity之间传对象的Demo,这两个对象分别实现了Parceable和Serializable接口,下面
请看代码:

布局文件activity_mian.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:context=".MainActivity">

    <Button
        android:text="@string/title_activity_parceable"
        android:id="@+id/par"
        android:layout_marginTop="30dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:text="@string/title_activity_serializable"
        android:layout_below="@+id/par"
        android:layout_marginTop="20dp"
        android:id="@+id/ser"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</RelativeLayout>

布局文件activity_parceable.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:context="com.mobile.intent.ParceableActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/text"
        android:text="@string/hello_world"/>

</RelativeLayout>

布局文件activity_serializable.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:context="com.mobile.intent.SerializableActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"/>


</RelativeLayout>

Student.java实体类

package com.mobile.intent;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by Bin.
 */
public class Student implements Parcelable{
    private String name;
    private String phoneNum;


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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(phoneNum);
    }

    public static final Parcelable.Creator<Student> CREATOR = new Creator<Student>() {
        public Student createFromParcel(Parcel source) {
            Student stu = new Student();
            stu.name = source.readString();
            stu.phoneNum = source.readString();
            return stu;
        }
        public Student[] newArray(int size) {
            return new Student[size];
        }
    };
    public String getName() {
        return name;
    }

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

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }

}

Teacher.java实体类

package com.mobile.intent;

import java.io.Serializable;

/**
 * Created Bin.
 */
public class Teacher 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;
    }
}

SerializableActivity.java

package com.mobile.intent;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;


public class SerializableActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_serializable);

        Teacher tea = (Teacher) getIntent().getSerializableExtra("SER");
        TextView tv = (TextView)findViewById(R.id.text);

        tv.setText("姓名:"+tea.getName()+"\n"+
                "年龄:"+tea.getAge());
    }

}

**

ParceableActivity.java

**

package com.mobile.intent;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;



public class ParceableActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_parceable);
        Student stu = (Student) getIntent().getParcelableExtra("PAR");
        TextView tv = (TextView)findViewById(R.id.text);

        tv.setText("姓名:"+stu.getName()+"\n"+
                "手机号:"+stu.getPhoneNum());

    }


}

MainActivity.java

package com.mobile.intent;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;


public class MainActivity extends ActionBarActivity implements View.OnClickListener{

    private Button par,ser;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView() {
        par = (Button)findViewById(R.id.par);
        ser = (Button)findViewById(R.id.ser);
        par.setOnClickListener(this);
        ser.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.par:
                startParceableActivity();
                break;
            case R.id.ser:
                startSerializableActivity();
                break;
        }
    }

    private void startParceableActivity() {
        Student stu = new Student();
        stu.setName("张三");
        stu.setPhoneNum("1823456789");
        Intent intent = new Intent(this,ParceableActivity.class);
        Bundle mBundle = new Bundle();
        mBundle.putParcelable("PAR",stu);
        intent.putExtras(mBundle);
        startActivity(intent);
    }
    private void startSerializableActivity() {
        Teacher tea = new Teacher();
        tea.setName("李老师");
        tea.setAge(28);
        Intent intent = new Intent(this,SerializableActivity.class);
        Bundle mBundle = new Bundle();
        mBundle.putSerializable("SER",tea);
        intent.putExtras(mBundle);
        startActivity(intent);
    }
}

运行效果图:
MainActivity界面
SerializableActivity界面
ParceableActivity界面

OK~今天就先到这里了
源代码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值