在 Android 开发中,序列化和反序列化是将对象转换为字节流以及从字节流还原对象的过程。Java 提供了 Serializable 接口,而 Android 提供了 Parcelable 接口来实现这一功能。
序列化和反序列化
- 序列化:将对象转换为字节流,以便存储或传输。
- 反序列化:将字节流转换回对象
Serializable 和 Parcelable 的区别
Serializable
Serializable 是 Java 提供的标准序列化接口。实现这个接口的类可以自动进行序列化和反序列化。
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// getters and setters
}
特点
- 自动化:实现 Serializable 接口的类不需要额外的代码即可进行序列化和反序列化。
- 性能较低:由于使用反射机制,序列化和反序列化的性能较低,尤其在 Android 中。
- 适用范围广:适用于任何 Java 平台,不仅限于 Android。
Parcelable
Parcelable 是 Android 提供的序列化接口,专为 Android 设计,性能优于 Serializable。
import android.os.Parcel;
import android.os.Parcelable;
public class User implements Parcelable {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
protected User(Parcel in) {
name = in.readString();
age = in.readInt();
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
@Override
public int describeContents() {
return 0;
}
// getters and setters
}
特点
- 手动实现:需要手动实现 writeToParcel 和 CREATOR,代码量较多。
- 性能较高:直接进行内存操作,性能优于 Serializable。
- 专为 Android 设计:适用于 Android 平台的进程间通信(IPC)。
Serializable、Parcelable 使用场景
- Serializable 适用于需要跨平台或跨 JVM 传输数据的场景,或者不在乎性能的简单数据存储和传输。
- Parcelable 适用于 Android 平台内的高性能数据传输,尤其是在 Activity、Service 和 Fragment 之间传递数据时。