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