🔥 什么是序列化
????????由于存在于内存中的对象都是暂时的,无法长期驻存,为了把对象的状态保持下来,这时需要把对象写入到磁盘或者其他介质中,这个过程就叫做序列化。
🔥 为什么序列化
🔥 实现序列化的方式
-
实现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红色
|