【Java、Android】序列化:Parcelable 和 Serializable

devtools/2024/11/25 14:54:29/

序列化:Parcelable 和 Serializable

为了把对象的状态保存下来,存到磁盘中,会用到序列化

  1. 序列化:内存中的对象—>磁盘
  2. 反序列化:磁盘中的对象—>内存

1 Serializable

用serialVersionUID辅助,一个类对应一个serialVersionUID。反序列化时,先判断是否是当前类的对象,再决定是否可以反序列化。

实现简单,内存开销大。

java">import java.io.Serializable;
public class SerializableImplement implements Serializable {/*** 生成序列号标识*/private static final long serialVersionUID = -2083503801443301445L;private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

2 Parcelable

为了解决Serializable内存开销大的问题,安卓提供了Parcelable。

Parcelable代码实现麻烦,但是内存开销小。

  1. 用writeToParcel方法,将对象映射成Parcel对象;
  2. 通过createFromParcel方法,将Parcel对象映射成我们的对象
java">import android.os.Parcel;
import android.os.Parcelable;public class ParcableImplement implements Parcelable {public int id;public String name;/*** 当前对象的内容描述,一般返回0即可** @return*/@Overridepublic int describeContents() {return 0;}protected ParcableImplement(Parcel in) {this.id = in.readInt();this.name = in.readString();}/*** 将当前对象写入序列化结构中** @param dest* @param flags*/@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeInt(this.id);dest.writeString(this.name);}/*** public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。* 重写接口中的两个方法:* createFromParcel(Parcel in) 实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层,* newArray(int size) 创建一个类型为T,长度为size的数组,供外部类反序列化本类数组使用。*/public static final Creator<ParcableImplement> CREATOR = new Creator<ParcableImplement>() {/*** 从序列化后的对象中创建原始对象*/@Overridepublic ParcableImplement createFromParcel(Parcel in) {return new ParcableImplement(in);}/*** 创建指定长度的原始对象数组* @param size* @return*/@Overridepublic ParcableImplement[] newArray(int size) {return new ParcableImplement[size];}};
}

3 Parcelable 和 Serializable的区别

  1. 实现上的差异:
    Serializable只需通过Serializable接口,给对象添加一个UID,系统会自动将其序列化;
    Parcelable不只需要实现Parcelable接口,还需要在类中添加一个静态成员变量;要去实现读写的抽象方法,包括writeToParcel和createFromParcel等等。

  2. 效率上的对比:
    在内存间传递数据,推荐使用Parcelable。安卓端的数据传递,包括Activity,AIDL等的数据传递。
    序列化到存储设备,推荐使用Serializable。


http://www.ppmy.cn/devtools/136859.html

相关文章

MySQL出现Waiting for table metadata lock的原因以及解决方法(已亲测)

参考&#xff1a;MySQL出现Waiting for table metadata lock的原因以及解决方法 - digdeep - 博客园 当对表执行truncate\drop 操作时&#xff0c;会出现一直处于等待的状态&#xff0c;通过show processlist可以看到TableA停滞在Waiting for table metadata lock的状态。kill…

Windows操作系统

1. Windows 操作系统的来历 Windows 是由 微软公司&#xff08;Microsoft&#xff09; 开发的一系列操作系统&#xff0c;最初作为一种图形用户界面&#xff08;GUI&#xff09;&#xff0c;它的诞生源于 1980 年代个人计算机的发展需求。 起源&#xff1a;与 MS-DOS 的联系 微…

硬件工程师零基础入门:一.电子设计安全要点与欧姆定律

硬件工程师零基础入门:一.电子设计安全要点与欧姆定律 第一节 电子设计安全要点第二节 欧姆定律 第一节 电子设计安全要点 电路小白最好先买直流稳压电源&#xff08;将高压转成低压直流电&#xff09;使用&#xff0c;尽量不要使用市电。 1.尽量不要捏住电源两端。 正确做法&a…

FIFO和LRU算法实现操作系统中主存管理

FIFO&#xff0c;用数组实现 1和2都是使用nextReplace实现新页面位置的更新 1、不精确时间&#xff1a;用ctime输出运行时间都是0.00秒 #include <iostream> #include <iomanip> #include<ctime>//用于计算时间 using namespace std;// 页访问顺序 int pa…

mysql5.7.44 64位版本下载

做系统如果用mysql5升级到8可以完美支持&#xff0c;但是如果用8想恢复到5是不兼容的&#xff0c;所以在此保存下5的下载地址&#xff0c;以防以后找不到了 MySQL :: Download MySQL Community Server (Archived Versions)&#xff0c;点击打开

springboot实战(17)(“大事件“——新增文章主体逻辑)

目录 一、新增文章涉及的数据表、实体类。 &#xff08;1&#xff09;表结构。 &#xff08;2&#xff09;实体类&#xff08;Article&#xff09; 二、接口文档分析。 &#xff08;1&#xff09;请求方式与请求路径。 &#xff08;2&#xff09;请求参数。 &#xff08;3&…

Proteus 8.17的详细安装教程

通过百度网盘分享的文件&#xff1a;Proteus8.17(64bit&#xff09;.zip 链接&#xff1a;https://pan.baidu.com/s/1zu8ts1Idhgg9DGUHpAve7Q 提取码&#xff1a;8q8v 1.右击【Proteus8.17(64bit&#xff09;.zip】&#xff0c;选择【全部解压缩......】。 &#xff0c; 2.…

Android 14 screenrecord录制视频失败的原因分析

文章目录 1. 权限问题2. 存储空间不足3. 命令被中断4. 目标路径问题5. Android 14 的新限制6. 文件系统同步问题7. 录制失败检查步骤总结&#xff1a; 在 Android 14 系统上&#xff0c;使用 screenrecord 命令录制视频后&#xff0c;生成的文件大小为 0&#xff0c;可能的原因…