Parcelable和Serializable
1、序列化 (Serialization)
序列化是将对象的状态信息转换为可以存储或传输的形式的过程(如:Java对象转换为字节序列)。Android中序列化有两种方式:Serializable以及Parcelable。
2、Parcelable和Serializable的差异
3、Serializable实现
a、Person:实现Serializable接口
变量serialVersionUID:是用来辅助序列化和反序列化的。(Android studio 自动生成:File–>Settings–>Editor–>Inspections–>Java–>Serialization issues–>Serializable class without 'serialVersionUID’勾选后apply,回到Person,类名上点击一下,等左边出现黄色警示灯,然后点击黄色警示灯,就能看到自动生成serialVersionUID的提示了。)
public class Person implements Serializable {
private static final long serialVersionUID = 5041213889313165285L;
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
b、SerializableActivity
public class SerializableActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_serializable);
Person person = new Person();
person.setAge(20);
person.setName("张三");
final Intent intent = new Intent(SerializableActivity.this,TotalActivity.class);
intent.putExtra("person",person);
findViewById(R.id.data).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent);
}
});
}
}
c、TotalActivity
public class TotalActivity extends AppCompatActivity {
public static final String TAG = "TotalActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_total);
Intent intent = getIntent();
Person p=(Person) intent.getSerializableExtra("person");
Log.i(TAG, "Name: "+p.getName());
Log.i(TAG, "Age:"+p.getAge());
}
}
4、Parcelable实现
a、Person2
public class Person2 implements Parcelable {
private String name;
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;
}
private int age;
Person2(){
}
protected Person2(Parcel in) {
age = in.readInt();
name = in.readString();
}
public static final Creator<Person2> CREATOR = new Creator<Person2>() {
//反序列化时从Parcel中读取数据
@Override
public Person2 createFromParcel(Parcel in) {
return new Person2(in);
}
@Override
public Person2[] newArray(int size) {
return new Person2[size];
}
};
@Override
public int describeContents() {
return 0;
}
//序列化时指定将哪些数据写入Parcel中,注意:写入顺序与读取顺序务必一致
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);
dest.writeString(name);
}
}
b、ParcelableActivity
public class ParcelableActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parcelable);
Person2 person = new Person2();
person.setName("李四");
person.setAge(26);
final Intent intent = new Intent(ParcelableActivity.this,TotalActivity.class);
intent.putExtra("person",person);
findViewById(R.id.data).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent);
}
});
}
}
c、TotalActivity
public class TotalActivity extends AppCompatActivity {
public static final String TAG = "TotalActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_total);
Intent intent = getIntent();
Person2 p=(Person2) intent.getParcelableExtra("person");
Log.i(TAG, "Name: "+p.getName());
Log.i(TAG, "Age:"+p.getAge());
}
}