🔥 什么是序列化
由于存在于内存中的对象都是暂时的,无法长期驻存,为了把对象的状态保持下来,这时需要把对象写入到磁盘或者其他介质中,这个过程就叫做 序列化 。
🔥 为什么序列化
- 永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中)。
- 对象在网络中传递。
- 对象在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 接口,并实现读写的抽象方法。如下:
1. 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红色
文章知识点与官方知识档案匹配,可进一步学习相关知识