Android 序列化Parcelable的使用详解
背景:
在Java虚拟机中,对象的传递称为数据传递不可或缺的一部分,但如果一旦虚拟机停止工作,该对象在内存中也就被释放,地址空间不存在,对象自然就不能再被重复利用,如果我们想持久使用这个对象怎么办?写到文件中?存数据库?最好的方法就是能够保存下来,把一个对象的空间地址以及属性保存下来,在Java中已提供了一个接口Serializable。
1.Serializable是Java的JDK提供的,由于该序列化不够丝滑,在PC等大型操作系统中使用,体验不出来,如果在Adnroid 虚拟机中,数据的传递存在一定的差异,这时,google官方提供了新的序列化对象Parcelable
Parcelable相比较Serializable要复杂的很多,Serializable序列化只要对象继承该接口,即可。但是Parcelable需要我们手动去分装
Parcelable序列化的封装
说明:
如果最外层Bean需要实现Parcelable,那么内部的变量也是一个类对象,也要实现序列化,可以先从变量类开始序列化,最后实现外层bean的序列化
序列化之前先把变量定义好,这样用助于后面序列化的操作
1.IDE自动封装
1.1先将当前类继承接口Parcelable
1.2将鼠标悬停在错误提示位置,这个时候IDE提示如下
1.3 我们只需要点击Add implementation Parcelable
1.4IDE会自动完成组装,自动读写变量
结果如下:
public class MyParcelBean implements Parcelable { private int age; private String name; private boolean sex; protected MyParcelBean(Parcel in) { age = in.readInt(); name = in.readString(); sex = in.readByte() != 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(age); dest.writeString(name); dest.writeByte((byte) (sex ? 1 : 0)); } @Override public int describeContents() { return 0; } public static final Creator<MyParcelBean> CREATOR = new Creator<MyParcelBean>() { @Override public MyParcelBean createFromParcel(Parcel in) { return new MyParcelBean(in); } @Override public MyParcelBean[] newArray(int size) { return new MyParcelBean[size]; } }; }
**************************************************************************************************
2.手动封装
手动封装我们需要知道,处理哪些东西,这些东西是什么。流程是什么
同样已MyParcelBean类为例,
2.1.类的变量定义好了,然后继承接口Parcelable
2.2.重写以下方法
@Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(age); dest.writeString(name); dest.writeByte((byte) (sex ? 1 : 0)); }
writeToParcel是我们需要处理的地方,这边提供了两个参数:Parcel 和flags
Parcel :是变量的封装,
flags:是标识
接下来我们重点讲解Parcel
1.Parcel 主要提供数据的读写,如果你是什么类型,在读写过程就用什么类型,但是boolean除外,
2.boolean类型再Parcel中,没有该类型,通过通过byte类型替代
3.读写的顺序必须对应,如下:
dest.writeInt(age); dest.writeString(name); dest.writeByte((byte) (sex ? 1 : 0));
存的顺序是这样,那么读的顺序也一定要这样,否则数据会异常
protected MyParaceBean(Parcel in) { age = in.readInt(); name = in.readString(); sex = in.readByte() != 0; }
3.每个parcelable接口都有一个造物者,我们还要实现这个固定写法:
public static final Creator<MyParaceBean> CREATOR = new Creator<MyParaceBean>() { @Override public MyParaceBean createFromParcel(Parcel in) { return new MyParaceBean(in); } @Override public MyParaceBean[] newArray(int size) { return new MyParaceBean[size]; } };
这是固定写法
4.我们需要实现一个保护类型的构造器,用来读在这数据
protected MyParaceBean(Parcel in) { age = in.readInt(); name = in.readString(); sex = in.readByte() != 0; }
5.关于Parcel write写有些要注意的地方
5.1对象的保存
如果保存一个对象,这个对象必须也要实现parcelable接口
在Bean中
private MyParaceBeanChild child;
写:
dest.writeParcelable(child, flags);
读:
child = in.readParcelable(MyParaceBeanChild.class.getClassLoader());
5.2数组数据的保存
List的数据保存,也是需要在List泛型对象中先实现parcelable的接口,
在Bena中定义如下:
private List<MyParaceBeanChild> list;
写:
dest.writeTypedList(list);
读:
list = in.createTypedArrayList(MyParaceBeanChild.CREATOR);
5.3Boolean类型
类型不支持,通过byte来复写,可以参考上面boolean说法
一般在读写类型中,Parcel数据封装提供了对应的绝大多数类型。
总结:
核心点:
1.构造器读数据
protected MyParaceBean(Parcel in) { }
2.重写方法:写数据
@Override
public void writeToParcel(Parcel dest, int flags) { }
3.造物标识:CREATOR
public static final Creator<MyParaceBean> CREATOR = new Creator<MyParaceBean>() { @Override public MyParaceBean createFromParcel(Parcel in) { return new MyParaceBean(in); } @Override public MyParaceBean[] newArray(int size) { return new MyParaceBean[size]; } };
只需要处理好这三个地方,其他都是自己的Java逻辑。
相关文章
- Android JetPack Compose详解 Compose的设计原理和概念(从入门到入土)
- android入门视频教程!程序员工作2年月薪12K,经典好文
- 曝iPhone15或换用USB-C接口;Google将下架第三方Android通话录音APP|极客头条
- 【技术分享】app自动化测试(Android)—— App 控件定位
- android控制之 adb shell (已完成,不定期增加内容)
- windows 64位下,React-Native环境搭建详解 (Android)
- Android:BLE智能硬件开发详解
- 框架模式 MVC 在Android中的使用
- Android Handler的内存抖动以及如何在子线程创建Handler详解
- Android JetPack组件之Room数据库的集成与详解
- Android 自动化集成打包平台搭建之Jkens详解
- Android enum(枚举类型)使用详解
- Android 11适配
- Android Studio上使用可视化调试工具Hierarchy Viewer
- Android 常用设计模式(二) -- 单例模式(详解)
- android WebView使用cmwap无法联网解决办法