Android 序列化(Serializable和Parcelable)
🔥 什么是序列化
由于存在于内存中的对象都是暂时的,无法长期驻存,为了把对象的状态保持下来,这时需要把对象写入到磁盘或者其他介质中,这个过程就叫做序列化。
🔥 为什么序列化
-
永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中)。
-
对象在网络中传递。
-
对象在IPC间传递。
🔥 实现序列化的方式
-
实现Serializable接口
-
实现Parcelable接口
🔥 Serializable 和 Parcelable 区别
-
Serializable 是Java本身就支持的接口。
-
Parcelable 是Android特有的接口,效率比实现Serializable接口高效(可用于Intent数据传递,也可以用于进程间通信(IPC))。
-
Serializable的实现,只需要implements Serializable即可。这只是给对象打了一个标记,系统会自动将其序列化。
-
Parcelabel的实现,不仅需要implements Parcelabel,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator接口。
-
Serializable 使用I/O读写存储在硬盘上,而Parcelable是直接在内存中读写。
-
Serializable会使用反射,序列化和反序列化过程需要大量I/O操作,Parcelable 自己实现封送和解封( marshalled &unmarshalled)操作不需要用反射,数据也存放在Native内存中,效率要快很多
💥 实现Serializable
-
import java.io.Serializable;
-
-
public class UserSerializable implements Serializable {
-
public String name;
-
public int age;
-
}
-
然后你会发现没有serialVersionUID。
Android Studio 是默认关闭 serialVersionUID 生成提示的,我们需要打开Setting,执行如下操作:
再次回到UserSerializable类,有个提示,就可以添加serialVersionUID了。
效果如下:
-
public class UserSerializable implements Serializable {
-
private static final long serialVersionUID = 1522126340746830861L;
-
public String name;
-
public int age = 0;
-
-
}
-
💥 实现Parcelable
Parcelabel的实现,不仅需要实现Parcelabel接口,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator 接口,并实现读写的抽象方法。如下:
-
public class MyParcelable implements Parcelable {
-
private int mData;
-
-
public int describeContents() {
-
return 0;
-
}
-
-
public void writeToParcel(Parcel out, int flags) {
-
out.writeInt(mData);
-
}
-
-
public static final Parcelable.Creator<MyParcelable> CREATOR
-
= new Parcelable.Creator<MyParcelable>() {
-
public MyParcelable createFromParcel(Parcel in) {
-
return new MyParcelable(in);
-
}
-
-
public MyParcelable[] newArray(int size) {
-
return new MyParcelable[size];
-
}
-
};
-
-
private MyParcelable(Parcel in) {
-
mData = in.readInt();
-
}
-
}
此时Android Studio 给我们了一个插件可自动生成Parcelable 。
🔥 自动生成 Parcelable
-
public class User {
-
String name;
-
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;
-
}
-
}
想进行序列化,但是自己写太麻烦了,这里介绍个插件操作简单易上手。
💥 先下载
💥 使用
💥 效果
-
public class User implements Parcelable {
-
String name;
-
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;
-
}
-
-
@Override
-
public int describeContents() {
-
return 0;
-
}
-
-
@Override
-
public void writeToParcel(Parcel dest, int flags) {
-
dest.writeString(this.name);
-
dest.writeInt(this.age);
-
}
-
-
public void readFromParcel(Parcel source) {
-
this.name = source.readString();
-
this.age = source.readInt();
-
}
-
-
public User() {
-
}
-
-
protected User(Parcel in) {
-
this.name = in.readString();
-
this.age = in.readInt();
-
}
-
-
public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
-
@Override
-
public User createFromParcel(Parcel source) {
-
return new User(source);
-
}
-
-
@Override
-
public User[] newArray(int size) {
-
return new User[size];
-
}
-
};
-
}
-
搞定。
写完了咱就运行走一波。
🔥 使用实例
💥 Serializable
-
MainActivity.class
-
Bundle bundle = new Bundle();
-
UserSerializable userSerializable=new UserSerializable("SCC",15);
-
bundle.putSerializable("user",userSerializable);
-
Intent intent = new Intent(MainActivity.this, BunderActivity.class);
-
intent.putExtra("user",bundle);
-
startActivity(intent);
-
-
BunderActivity.class
-
Bundle bundle = getIntent().getBundleExtra("user");
-
UserSerializable userSerializable= (UserSerializable) bundle.getSerializable("user");
-
MLog.e("Serializable:"+userSerializable.name+userSerializable.age);
-
-
日志:
-
2021-10-25 E/-SCC-: Serializable:SCC15
💥 Parcelable
-
MainActivity.class
-
Bundle bundle = new Bundle();
-
bundle.putParcelable("user",new UserParcelable("SCC",15));
-
Intent intent = new Intent(MainActivity.this, BunderActivity.class);
-
intent.putExtra("user",bundle);
-
startActivity(intent);
-
-
BunderActivity.class
-
Bundle bundle = getIntent().getBundleExtra("user");
-
UserParcelable userParcelable= (UserParcelable) bundle.getParcelable("user");
-
MLog.e("Parcelable:"+userParcelable.getName()+userParcelable.getAge());
-
-
日志:
-
2021-10-25 E/-SCC-: Parcelable:SCC15
🔥 Parcelable 中使用泛型
💥 UserParcelable
-
public class UserParcelable<T extends Parcelable> implements Parcelable {
-
private String name;
-
private int age;
-
private T data;
-
-
//...set/get部分省略
-
-
public T getData() {
-
return data;
-
}
-
-
public void setData(T data) {
-
this.data = data;
-
}
-
-
public UserParcelable(String name, int age, T data) {
-
this.name = name;
-
this.age = age;
-
this.data = data;
-
}
-
-
@Override
-
public int describeContents() {
-
return 0;
-
}
-
-
@Override
-
public void writeToParcel(Parcel dest, int flags) {
-
dest.writeString(this.name);
-
dest.writeInt(this.age);
-
//这里:先保存这个泛型的类名
-
dest.writeString(data.getClass().getName());
-
dest.writeParcelable(this.data, flags);
-
}
-
-
public void readFromParcel(Parcel source) {
-
this.name = source.readString();
-
this.age = source.readInt();
-
//这里
-
String dataName = source.readString();
-
try {
-
this.data = source.readParcelable(Class.forName(dataName).getClassLoader());
-
} catch (ClassNotFoundException e) {
-
e.printStackTrace();
-
}
-
}
-
-
protected UserParcelable(Parcel in) {
-
this.name = in.readString();
-
this.age = in.readInt();
-
//这里
-
String dataName = in.readString();
-
try {
-
this.data = in.readParcelable(Class.forName(dataName).getClassLoader());
-
} catch (ClassNotFoundException e) {
-
e.printStackTrace();
-
}
-
}
-
-
public static final Creator<UserParcelable> CREATOR = new Creator<UserParcelable>() {
-
@Override
-
public UserParcelable createFromParcel(Parcel source) {
-
return new UserParcelable(source);
-
}
-
-
@Override
-
public UserParcelable[] newArray(int size) {
-
return new UserParcelable[size];
-
}
-
};
-
}
💥 Tman
-
public class Tman implements Parcelable {
-
String color;
-
-
public Tman(String color) {
-
this.color = color;
-
}
-
-
public String getColor() {
-
return color;
-
}
-
-
public void setColor(String color) {
-
this.color = color;
-
}
-
-
@Override
-
public int describeContents() {
-
return 0;
-
}
-
-
@Override
-
public void writeToParcel(Parcel dest, int flags) {
-
dest.writeString(this.color);
-
}
-
-
public void readFromParcel(Parcel source) {
-
this.color = source.readString();
-
}
-
-
protected Tman(Parcel in) {
-
this.color = in.readString();
-
}
-
-
public static final Creator<Tman> CREATOR = new Creator<Tman>() {
-
@Override
-
public Tman createFromParcel(Parcel source) {
-
return new Tman(source);
-
}
-
-
@Override
-
public Tman[] newArray(int size) {
-
return new Tman[size];
-
}
-
};
-
}
💥 使用
-
MainActivity.class
-
Bundle bundle = new Bundle();
-
bundle.putParcelable("user",new UserParcelable<>("你好",2021,new Tman("红色")));
-
Intent intent = new Intent(MainActivity.this, BunderActivity.class);
-
intent.putExtra("user",bundle);
-
startActivity(intent);
-
-
BunderActivity.class
-
Bundle bundle = getIntent().getBundleExtra("user");
-
UserParcelable<Tman> userParcelable= (UserParcelable) bundle.getParcelable("user");
-
MLog.e("Parcelable:"+userParcelable.getName()+userParcelable.getAge()+userParcelable.getData().getColor());
-
-
日志:
-
2021-10-25 E/-SCC-: Parcelable:你好2021红色
-
文章来源: shuaici.blog.csdn.net,作者:帅次,版权归原作者所有,如需转载,请联系作者。
原文链接:shuaici.blog.csdn.net/article/details/121008960
- 点赞
- 收藏
- 关注作者
评论(0)