为什么需要序列化
当我们需要在多个 Activity 之间传递对象时,我们不能直接传递对象的引用,我们应该对对象进行序列化,将对象转换成可传输的状态,然后放到 Intent 中进行传递。在 Android 中,我们可以通过 Serializable 和 Parcelable 来对对象进行序列化。
Serializable
Serailizable 是 Java 的一个接口,很容易实现,Java 在一定的条件下会自动帮我们去序列化对象,但是处理的方法相对较慢,会产生很多的临时变量,频繁的触发垃圾回收机制。
Parcelable
Parcelable 是 Android 特有的一个接口,它有丰富的方法在 Activitys 之间传递数据,当我们需要通过 Intent 在 Activitys 之间传递一个对象时,使用 Parcelabel 会比 Serializable 快很多(大约10倍左右),但实现该接口会相对于复杂一些,需要重写它的 describeContent() 和 writeToParcel(Parcel dest, int flags) 方法,并且需要注意读写顺序。
具体实现方法
通过 Serializable 方法,对 User 对象进行序列化,然后传递给 SecondActivity,以及通过 Parcelable 方法对 Article 对象进行序列化,然后传递给 ThirdActivity,效果如下:
首先对 model 进行序列化
通过实现 Serializable 接口,对 User 进行序列化。
public class User implements Serializable {
private String name;
private String age;
private String hobby;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
通过实现 Parcelable 接口,对 Article 进行序列化。
public class Article implements Parcelable {
private String title;
private String author;
private String url;
public Article() {
}
private Article(Parcel in) {
title = in.readString();
author = in.readString();
url = in.readString();
}
public static final Creator<Article> CREATOR = new Creator<Article>() {
@Override
public Article createFromParcel(Parcel in) {
return new Article(in);
}
@Override
public Article[] newArray(int size) {
return new Article[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(title);
dest.writeString(author);
dest.writeString(url);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
在 MainActivity 中,使用 Serializable 序列化 User 对象,然后传递给 SecondActivity,使用 Parcelable 序列化 Article 对象,然后传递给 ThirdActivity。
MainActivity.java
@Override
public void onClick(View v) {
switch (v.getId()) {
//
case R.id.put_serializable:
User user = new User();
user.setName("JereChen");
user.setAge("22");
user.setHobby("playing basketball");
Bundle bundle = new Bundle();
bundle.putSerializable(PUT_SERIALIZABLE_USER_KEY, user);
Intent serializableIntent = new Intent(MainActivity.this, SecondActivity.class);
serializableIntent.putExtras(bundle);
startActivity(serializableIntent);
break;
case R.id.put_parcelable:
Article article = new Article();
article.setTitle("Android 学习笔记");
article.setAuthor("JereChen");
article.setUrl("https://blog.csdn.net/jerechen");
Bundle parcelableBundle = new Bundle();
parcelableBundle.putParcelable(PUT_PARCELABLE_ARTICLE_KEY, article);
Intent parcelableIntent = new Intent(MainActivity.this, ThirdActivity.class);
parcelableIntent.putExtras(parcelableBundle);
startActivity(parcelableIntent);
break;
default:
break;
}
}
在 SecondActivity 中,通过 getSerializable() 方法拿到 User 对象。
SecondActivity.java
TextView nameTv = findViewById(R.id.name_tv);
TextView ageTv = findViewById(R.id.age_tv);
TextView hobbyTv = findViewById(R.id.hobby_tv);
Intent serializableIntent = getIntent();
Bundle serializableBundle = serializableIntent.getExtras();
User user = null;
if (serializableBundle != null) {
user = (User) serializableBundle.getSerializable(MainActivity.PUT_SERIALIZABLE_USER_KEY);
}
if (user != null) {
nameTv.setText(user.getName());
ageTv.setText(user.getAge());
hobbyTv.setText(user.getHobby());
}
在 ThirdActivity 中,通过 getParcelable() 方法拿到 Article 对象。
ThirdActivity.java
TextView titleTv = findViewById(R.id.title_tv);
TextView authorTv = findViewById(R.id.author_tv);
TextView urlTv = findViewById(R.id.url_tv);
Intent parcelableIntent = getIntent();
Bundle parcelBundle = parcelableIntent.getExtras();
Article article = null;
if (parcelBundle != null) {
article = parcelBundle.getParcelable(MainActivity.PUT_PARCELABLE_ARTICLE_KEY);
}
if (article != null) {
titleTv.setText(article.getTitle());
authorTv.setText(article.getAuthor());
urlTv.setText(article.getUrl());
}