IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 序列化(Serializable和Parcelable) -> 正文阅读

[移动开发]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红色

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 13:09:42  更:2021-10-29 13:12:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:13:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码