序列化的概念,用于把一个对象转换为字节序列,然后再对这个字节序列做存储和传递操作,与之对应的是反序列化,反序列化是把一个字节序列恢复为Java对象的过程,而序列化是把Java对象转化为字节序列的过程。
Serializable
- Serializable序列化不保存静态变量,另外使用Transient关键字可声明对指定字段不做序列化。
2.由于Serializable方式使用了反射机制,使得序列化的过程相对较慢。并且,这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。
3.Serializable可将数据持久化方便保存,所以在需要保存文件或网络传输数据时应选择Serializable。
public class SData implements Serializable{
public int age;
public String name;
public Boolean sex;
public double height;
}
Parcelable
1.Parcelable数据仅在内存中存在,所以在内存间数据传输时推荐使用
2.采用Parcelable方式的类,需要自己定义如何打包(写数据)和解包(读数据),其余的序列化操作则由底层实现。具体需要实现的方法如下:
<1>writeToParcel(Parcel out, int flags) : 写数据
<2>Parcelable.Creator<类名> CREATOR : 例行公事实现createFromParcel(读数据)和newArray
<3>describeContents : 返回0即可
public class PDate implements Parcelable {
public int age;
public String name;
public Boolean sex;
public double height;
public static final Creator<PDate> CREATOR = new Creator<PDate>() {
// 读数据
@Override
public PDate createFromParcel(Parcel in) {
PDate pDate=new PDate();
pDate.age=in.readInt();
pDate.name=in.readString();
pDate.sex=in.readByte()!=0;
pDate.height=in.readDouble();
return pDate;
}
@Override
public PDate[] newArray(int size) {
return new PDate[size];
}
};
@Override
public int describeContents() {
return 0;
}
// 写数据
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);
dest.writeString(name);
dest.writeDouble(height);
dest.writeByte((byte) (sex ? 1 : 0));
}
}
Parcelable暂不支持直接操作布尔boolean类型,但能间接通过设置byte位来实现boolean类型的参数传递。
下面是数据的传递代码
MainActivity
public class MainActivity extends Activity implements View.OnClickListener {
public Button button1, button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button) findViewById(R.id.SDate);
button2 = (Button) findViewById(R.id.PDate);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.SDate:
SData sData = new SData();
sData.age = 22;
sData.name = "bingge";
sData.sex = true;
sData.height = 18.5;
Intent intent = new Intent(this, Serializable_Activity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("people", sData);
intent.putExtras(bundle);
startActivity(intent);
break;
case R.id.PDate:
PDate pDate = new PDate();
pDate.age = 18;
pDate.name = "lihong";
pDate.sex = false;
pDate.height = 16.5;
Intent intent2 = new Intent(this, Pacelable_Activity.class);
Bundle bundle2 = new Bundle();
bundle2.putParcelable("hong", pDate);
intent2.putExtras(bundle2);
startActivity(intent2);
break;
default:
}
}
}
Serializable_Activity接收数据
public class Serializable_Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.serializable_layout);
Bundle bundle = getIntent().getExtras();
SData sData = (SData) bundle.getSerializable("people");
String daye = sData.age + "";
String daye2 = sData.name;
String daye3 = sData.sex + "";
String daye4 = sData.height + "";
System.out.println("shuju:" + daye + daye2 + daye3 + daye4);
}
}
Pacelable_Activity接收数据
public class Pacelable_Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.parcelable_layout);
Bundle bundle = getIntent().getExtras();
PDate pDate = bundle.getParcelable("hong");
String daye= pDate.age+"";
String daye2= pDate.name;
String daye3= pDate.sex+"";
String daye4= pDate.height+"";
System.out.println("shuju:"+daye+daye2+daye3+daye4);
}
}