Android:Serializable和Parcelable的持久化保存

2023-11-07

转自:https://www.cnblogs.com/duoshou/articles/8856111.html

前言:

Serializable和Parcelable能够将对象序列化,使之能够在一些特殊场景中进行传输,再进行数据的恢复(Serializable是Java实现的接口,而Parcelable是Android实现的)。

两者作用类似但是实现等其他方面有较大区别,比较多的说法认为Parcelable不适合用于数据的持久化保存,但合适与否和是否可行完全是两码事(GSON是另外一种保存对象的方式)。

出于好奇想从性能方面比较两者持久化的异同。

 

一.Serializable

需要实现的类如下

复制代码

class SerialData implements Serializable {

    private static final long serialVersionUID = -7060210544622464481L;

    public ArrayList<String> array;

    public SerialData() {
        array = new ArrayList<String>();
        for (int i = 0; i < 100000; i++) {
            array.add(new String("123"));
        }
    }
}

复制代码

写方法

复制代码

private void saveAsSerializable(SerialData data) {
        FileOutputStream fos;
        ObjectOutputStream oos;
        try {
            fos = getApplicationContext().openFileOutput(TAG,
                    Context.MODE_PRIVATE);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(data);
            oos.close();
            fos.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

复制代码

读方法

复制代码

private SerialData readData() {
        SerialData obj = null;
        FileInputStream fis;
        ObjectInputStream ois;
        try {
            fis = getApplicationContext().openFileInput(TAG);
            ois = new ObjectInputStream(fis);
            obj = (SerialData) ois.readObject();
            ois.close();
            fis.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (obj != null)
            return obj;
        else
            return null;

    }

复制代码

二.Parcelable

实现类

复制代码

class ParceData implements Parcelable {
    public ArrayList<String> array;

    public ParceData() {
        array = new ArrayList<String>();
        for (int i = 0; i < 100000; i++) {
            array.add(new String("123"));
        }
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeStringList(array);
    }

    public static final Parcelable.Creator<ParceData> CREATOR = new Creator<ParceData>() {
        @Override
        public ParceData[] newArray(int size) {
            return new ParceData[size];
        }

        @Override
        public ParceData createFromParcel(Parcel in) {
            return new ParceData(in);
        }
    };

    public ParceData(Parcel in) {
        array = new ArrayList<String>();
        in.readStringList(array);
    }
}

复制代码

写方法

复制代码

protected void saveParce() {
        FileOutputStream fos;
        try {
            fos = getApplicationContext().openFileOutput(TAG,
                    Context.MODE_PRIVATE);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            Parcel parcel = Parcel.obtain();
            parcel.writeParcelable(new ParceData(), 0);

            bos.write(parcel.marshall());
            bos.flush();
            bos.close();
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

复制代码

读方法

复制代码

protected void loadParce() {
        FileInputStream fis;
        try {
            fis = getApplicationContext().openFileInput(TAG);
            byte[] bytes = new byte[fis.available()];
            fis.read(bytes);
            Parcel parcel = Parcel.obtain();
            parcel.unmarshall(bytes, 0, bytes.length);
            parcel.setDataPosition(0);

            ParceData data = parcel.readParcelable(ParceData.class.getClassLoader());
            fis.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

复制代码

三.速度比较

1.Serializable

执行如下操作:

SerialData data = new SerialData();
Log.e("time", "befor = " + System.currentTimeMillis());
saveAsSerializable(data);
Log.e("time", "after = " + System.currentTimeMillis());

10次平均:2889ms

 

2.Parcelable

操作如下:

Log.e("time", "befor = " + System.currentTimeMillis());
saveParce();
Log.e("time", "after = " + System.currentTimeMillis());

 

10次平均:360ms

 

四.内存比较

初始状态:

 

 

执行一次Serializable的写入

执行一次Parcelable的写入

 

 

 

Pacelable在速度上,内存的使用上都比Serializable有优势。虽然如此,实际上面的数据并没有太大的参考意义,两个类都创建了10万个对象,项目中这种情况很少遇到。

实现起来Serializable更简单,实现接口即可,而Pacelable作二进制的转化,对写入和读取的顺序都要保持一致,对象越多实现越复杂。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:Serializable和Parcelable的持久化保存 的相关文章

  • 一般如何处理 CXF 请求处理程序中的输入参数?

    我一直在使用 apache CXF 版本 2 2 2 JAX RS 进行一些工作 我试图在调用业务方法之前在 CXF 请求处理程序中引入数据验证层 幸运的是 我在请求处理程序 DataValidationHandler 中遇到输入参数处理问
  • JPA:运行时如何指定类对应的表名?

    注意 我对 Java 非常熟悉 但对 Hibernate 或 JPA 还不太熟悉 还没有 我想编写一个通过 JPA 与 DB2 400 数据库通信的应用程序 现在我可以获取表中的所有条目并将它们列出到 System out 使用 MyEcl
  • 外部硬件指纹扫描仪和 Android 设备集成

    我想建立一个android像员工考勤这样的应用程序使用fingerprint scanner 我想知道 是否可以使用外部硬件设备进行指纹识别 扫描 如何将Android应用程序与外部硬件finger集成 打印扫描设备 如何从外部硬件设备获取
  • Java中构造函数中的长参数列表[重复]

    这个问题在这里已经有答案了 可能的重复 重构具有太多 6 个以上 参数的方法的最佳方法是什么 https stackoverflow com questions 439574 whats the best way to refactor a
  • JavaFx ComboBox 绑定混乱

    我有一个 I18N 实现 它通过属性绑定 JavaFX UI 元素 例如 def translateLabel l Label key String args Any Unit l textProperty bind createStrin
  • 编写潜在并发问题的证明

    我正在阅读 Java 并发实践 并尝试编写一段代码来表明第 3 5 1 章中作为示例提供的类确实会引入问题 public class Holder public int n public Holder int n this n n publ
  • 是否值得清理 Filter 中的 ThreadLocals 来解决线程池相关问题?

    简而言之 tomcat 使用线程池 因此线程被重用 一些图书馆使用ThreadLocal变量 但不要清理它们 使用 remove 所以实际上它们将 脏 线程返回到池中 Tomcat 具有在关闭时检测这些事情并清理线程局部变量的新功能 但这意
  • Java RMI 通过互联网

    我正在用 Java 开发一个游戏 使用 RMI 进行所有网络通信 RMI 允许我调用服务器上的方法 但这对我来说还不够 我还希望服务器能够在连接的客户端之间传播消息 我的客户端查找服务器 它的接口扩展了远程 并在其上注册 它允许服务器知道谁
  • 在 ElasticSearch API 应用程序中找不到 NodeBuilder

    我正在尝试实现 Elasticsearch API 我的系统接受 nodeBuilder 时出现错误 这是代码 import org elasticsearch action index IndexResponse import org e
  • 二维数组中的寻路

    假设我有这个二维数组地图 0 0 0 0 7 1 1 1 1 1 1 1 1 0 7 7 7 7 1 1 1 24 1 1 1 1 0 7 24 24 24 24 24 24 24 1 1 3 1 0 7 23 23 23 23 23 23
  • Spring Boot 是否支持服务器名称指示(SNI)?

    Spring Boot 是否支持服务器名称指示 SNI 具体来说 运行嵌入式 Tomcat 服务器并打包为可执行 jar 文件的 Spring Boot 2 2 2 RELEASE 应用程序是否可以根据传入请求的主机名支持多个 SSL 证书
  • 非法监控状态异常

    如何将轮询线程传递给另一个线程进行处理 程序执行在控制器类中 该类具有 main 方法和线程池 主类控制器 public static void main String args throws InterruptedException Ru
  • 如何正确安装mysqlconnecter java?

    上网冲浪后 我意识到我应该在系统环境变量中设置类路径连接器 jar 文件的路径文件我这样做了 并在命令行中输入此命令我有这个 C Users User gt echo classpath D classpath mysql connecto
  • java.util.Objects 与Optional 哪个更可取?

    The java util Objects http download java net java jdk9 docs api java util Objects html类通过许多新方法进行了扩展 对象 requireNonNullEls
  • 如何在 groovy 中将输出重定向到 stderr?

    我正在寻找一种将 groovy 脚本中的输出重定向到 stderr 的方法 catch Exception e println Want this to go to stderr 就在我的脑海中 你不能做一些自我接线吗 def printE
  • 无法渲染非字符串的属性,toString 返回:null SPRING MVC 中的错误

    我正在尝试按照本教程为我的 spring mvc 项目创建一个通用错误处理程序 http www mkyong com spring mvc spring mvc exceptionhandler example http www mkyo
  • jstack 是否停止在较新的 JDK8 版本上工作?

    我惊讶地发现 不知何故 最近 jstack 停止了在较新的 JDK 8 上的工作 我不确定这发生在哪个版本 但我确实得到 36649 Unable to open socket file target process not respond
  • 运行 JAR 时“JCE 无法验证提供者 BC”

    在我的 scala 项目中我使用 org bouncycastle bcprov jdk14 1 51 用于密码学 如果它在 Scala IDE 中测试我的项目 它工作得很好 但是一旦我制作了一个 JAR 并尝试通过以下方式运行它java
  • hibernate通过主键查询

    我想通过主键创建查询 假设我有类主键 PersonKey 属性是 name 和 id 我有 Person 类 属性是 PersonKey 地址 DOB 现在 我想通过主键搜索人员 首先 我创建 PersonKey 的实例 并将名称设置为 j
  • 在 Eclipse Testrunner 中使用名称的 ParameterizedTest

    当您使用 Eclipse TestRunner 运行 JUnit 4 ParameterizedTest 时 图形表示相当愚蠢 对于每个测试 您都有一个名为 0 1 ETC 是否可以进行测试 0 1 等显式名称 实施一个toString测试

随机推荐

  • 【会议资源】2022年第四届计算与人工智能国际研讨会(ISCAI 2022)

    2022年第四届计算与人工智能国际研讨会 ISCAI 2022 重要信息 会议网址 www iscai org 会议时间 2022年12月16 18日 召开地点 中国北京 截稿时间 2022年11月16日 录用通知 投稿后2周内 收录检索
  • Socket通信及文件操作

    java Socket通信及文件操作 编译软件 Eclipse 一 客户端 package com import java io BufferedReader import java io DataOutputStream import j
  • Mysql学习笔记-Mysql基础(基础看这篇就够了)

    数据库的基本概念 1 数据库的英文单词 DataBase 简称 DB 2 什么数据库 用于存储和管理数据的仓库 3 数据库的特点 1 持久化存储数据的 其实数据库就是一个文件系统 2 方便存储和管理数据 3 使用了统一的方式操作数据库 SQ
  • 【Linux】虚拟机免密登录

    以node1 node2为例 方法一 利用ssh keygen生成公钥和私钥 1 原理 在node1上生成公钥和私钥 之后将公钥复制到其他的虚拟机上 虚拟机通过匹配公钥则可以实现免密的操作 2 步骤 1 连接到node1 c ssh roo
  • Unknown CMake command "add_compile_definitions"

    Unknown CMake command add compile definitions 解决方法 换cmake 3 14
  • selenium自动化测试--126邮箱登录问题总结

    虫师著selenium 2自动化测试实战基于python语言第四章习题4 3 1 126邮箱登录练习问题总结 练习过程中 参考以下博友的博客顺利完成练习题 https blog csdn net cyjs1988 article detai
  • java.io.FileNotFoundException: xxx.txt (系统找不到指定的文件。) 的错误解决办法

    这是我报错的原来的代码 package day19 java2 import java io File import java io FileInputStream import java io IOException ClassName
  • saltstack+zabbix

    环境 server1 172 25 60 1 salt master salt minion zabbix server server2 172 25 60 2 salt minion zabbix agent 1 软件包安装过程存在许多依
  • 【小白笔记】——AD铺铜设置铜与焊盘、通孔的全连接

    目录 一 热焊盘与花焊盘的区别与比较 二 AD静态铺铜如何设置连接样式 一 热焊盘与花焊盘的区别与比较 来自百度百科 热焊盘 热焊盘指大面积的接地 电 中 常用元器件的腿与其连接 对连接腿的处理需要进行综合的考虑 就电气性能而言 元件腿的焊
  • 【数学建模】青少年犯罪问题

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 逐步回归分析法 1 1 逐步回归分析定义 最优回归方程 1 2 stepwise函数介绍 二 例题 青少年犯罪问题 2 1 题目简述 2 2 问题一建模与求解
  • 定制化UINavigationBar

    FirstViewController 定制化UINavigationBar void customNavigationBar 按钮被挡住 原因是 navigationbar的透明度默认为YES 先取出navigationbar UINav
  • java中countinue,.random(用于产生一个随机数)入门可看

    1 countinue 用在循环中 基于条件控制 跳过其次循环体内容的执行 继续下一次的执行 break 用在循环中 基于条件控制 终止循环体内容的执行 也就是结束当前的整个循环 eg public class zhou public st
  • php提取css生成单独文件,webapck将css 打包后单独提取到一个css文件中

    webpack4 提倡 一旦用了这个 不能使用style loader 以及css module 安装 npm install save dev mini css extract plugin rules rules test css us
  • SQLServer 中实现类似MySQL中的group_concat()函数的功能

    SQLServer中没有MySQL中的group concat函数 可以把分组的数据连接在一起 后在网上查找 找到了可以实现此功能的方法 特此记录下 SELECT a stuff SELECT b FROM tb WHERE a t a F
  • STM32 USB_SPI_FLASH 简易U盘设计

    这是大三下学期EDA实训的内容 设计制作了一个简易的U盘 主要涉及STM32单片机 W25Q128闪存芯片 电路板绘制 文件系统移植等内容 发布出来供大家参考 仅供学习交流使用 实验步骤仅供参考 转载请注明原文链接 https blog c
  • java数据传到前端页面_02 前端页面数据传递到后台java

    本文将阐述如何将前端页面数据传递到后台java代码 1 环境约束 win10 64位操作系统 idea2018 1 5 jdk 8u162 windows x64 spring4 2 4 前提约束 操作步骤 基本类型传输 RequestMa
  • Android使用AES加解密

    AES为对称加密 加解密用一套秘钥 秘钥自己随便定义 长度必须为16 或 32 个字符 1 AES工具类 AES 对称加密算法 加解密工具类 RequiresApi api Build VERSION CODES KITKAT public
  • getline()与get()

    1 getline getline 函数读取整行 通过换行符来确定输入结尾 然后丢弃换行符 1 作为istream中的类方法 char name 20 cin getline name 20 把一行读入到name数组中 这行字符不超过19个
  • python opencv 同窗口显示多个图像

    为了便于比对图像处理前后的效果 特别是算法处理前后的效果图 我们需要同时显示多张图片 这里采用opencv图像拼接的方法来实现我们想要的效果 1 定义函数show multi img 定义图片显示函数show multi img 共包括5参
  • Android:Serializable和Parcelable的持久化保存

    转自 https www cnblogs com duoshou articles 8856111 html 前言 Serializable和Parcelable能够将对象序列化 使之能够在一些特殊场景中进行传输 再进行数据的恢复 Seri