热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaAndroid基础知识梳理(2)序列化

一、Parcelable和Serializable对象的序列化是把Java对象转化为字节序列并存储至一个存储媒介(硬盘或者内存)的过程,反

一、ParcelableSerializable

对象的序列化是把Java对象转化为字节序列并存储至一个存储媒介(硬盘或者内存)的过程,反序列化则是把字节序列恢复为Java对象的过程,但它们仅处理Java变量而不处理方法。

序列化的原因:

  • 永久性保存对象,保存对象的字节序列到本地文件中。Serializable
  • 通过序列化对象在网络中传递对象。Serializable
  • 通过序列化在进程间传递对象。Parcelable

两种序列化的区别:

  • Serializable只需要对某个类以及它的属性实现Serializable接口即可,它的缺点是使用了反射,序列化的过程比较慢,这种机制会在序列化的时候创建许多的临时对象,容易引发频繁的gc
  • ParcelableAndroid平台特有的,在使用内存的时候性能更好,但Parcelable不能使用在要将数据存储在磁盘的情况下,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况。

二、序列化在Android平台上的应用

2.1 通过intent传递复杂对象

intent支持传递的数据类型包括:

  • 基本类型的数据、及其数组。
  • String/CharSequence类型的数据、及其数组。
  • Parcelable/Serializable,及其数组/列表数据。

2.2 SharePreference存储复杂对象

三、SerializableParcelable

3.1 使用Serializable的读写操作

首先定义我们要序列化的对象。

public class SBook implements Serializable { public int id; public String name;
}

进行读写操作:

private void readSerializable() {ObjectInputStream object = null;try {FileInputStream out = new FileInputStream(Environment.getExternalStorageDirectory() + "/sbook.txt");object = new ObjectInputStream(out);SBook book = (SBook) object.readObject();if (book != null) {Log.d(TAG, "book, id=" + book.id + ",name=" + book.name);} else {Log.d(TAG, "book is null");}} catch (Exception e) {Log.d(TAG, "readSerializable:" + e);} finally {try {if (object != null) {object.close();}} catch (Exception e) {Log.d(TAG, "readSerializable:" + e);}}}private void writeSerializable() {SBook book = new SBook();book.id = 1;book.name = "SBook";ObjectOutputStream object = null;try {FileOutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory() + "/sbook.txt");object = new ObjectOutputStream(out);object.writeObject(book);object.flush();} catch (Exception e) {Log.d(TAG, "writeSerializable:" + e);} finally {try {if (object != null) {object.close();}} catch (Exception e) {Log.d(TAG, "writeSerializable:" + e);}}}

3.2 使用Parcelable的读写操作

定义序列化对象:

public class PBook implements Parcelable {public int id;public String name;public PBook(int id, String name) {this.id = id;this.name = name;}private PBook(Parcel in) {id = in.readInt();name = in.readString();}public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {@Overridepublic PBook[] newArray(int size) {return new PBook[size];}@Overridepublic PBook createFromParcel(Parcel source) {return new PBook(source);}};@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeInt(id);dest.writeString(name);}
}

写入和读取:

private Intent writeParcelable() {PBook tony &#61; new PBook(1, "tony");PBook king &#61; new PBook(2, "king");ArrayList list &#61; new ArrayList<>();list.add(tony);list.add(king);Intent intent &#61; new Intent();intent.putParcelableArrayListExtra("PBook", list);return intent;}private void readParcelable(Intent intent) {if (intent !&#61; null) {ArrayList list &#61; intent.getParcelableArrayListExtra("PBook");if (list !&#61; null) {for (PBook book : list) {Log.d(TAG, "readParcelable, id&#61;" &#43; book.id &#43; ", name&#61;" &#43; book.name);}}}}

四、SharePreference存储复杂对象

//obejct -> ObjectOutputStream(ByteArrayOutputStream) -> ByteArrayOutputStream() -> byte[] -> String -> spprivate void writeSP() {SBook book &#61; new SBook();book.id &#61; 2;book.name &#61; "sp";SharedPreferences sp &#61; getSharedPreferences("SBookSP", MODE_PRIVATE);ByteArrayOutputStream os &#61; new ByteArrayOutputStream();try {ObjectOutputStream object &#61; new ObjectOutputStream(os);object.writeObject(book);String base64 &#61; new String(Base64.encode(os.toByteArray(), Base64.DEFAULT));SharedPreferences.Editor editor &#61; sp.edit();editor.putString("SBook", base64);editor.apply();} catch (Exception e) {}}//sp -> string -> byte[] -> ByteArrayInputStream(byte[]) -> ObjectInputStream(ByteArrayInputStream) -> objectprivate void readSP() {SharedPreferences sp &#61; getSharedPreferences("SBookSP", MODE_PRIVATE);String sbook &#61; sp.getString("SBook", "");if (sbook.length() > 0) {byte[] base64 &#61; Base64.decode(sbook.getBytes(), Base64.DEFAULT);ByteArrayInputStream is &#61; new ByteArrayInputStream(base64);try {ObjectInputStream object &#61; new ObjectInputStream(is);SBook book &#61; (SBook) object.readObject();if (book !&#61; null) {Log.d(TAG, "readSP, id&#61;" &#43; book.id &#43; ", name&#61;" &#43; book.name);}} catch (Exception e) {}}}



推荐阅读
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 通过采用用户数据报协议(UDP),本研究设计并实现了一种高效的文件传输方法。在发送端,系统利用Java编程语言中的相关类库,如`File`和`FileInputStream`,实现了文件的读取与分段处理,确保了数据的快速传输。该方法不仅提高了传输效率,还降低了网络拥塞的风险,适用于大规模文件传输场景。 ... [详细]
  • 在第二课中,我们将深入探讨Scala的面向对象编程核心概念及其在Spark源码中的应用。首先,通过详细的实战案例,全面解析Scala中的类和对象。作为一门纯面向对象的语言,Scala的类设计和对象使用是理解其面向对象特性的关键。此外,我们还将介绍如何通过阅读Spark源码来进一步巩固对这些概念的理解。这不仅有助于提升编程技能,还能为后续的高级应用开发打下坚实的基础。 ... [详细]
  • JDK 1.8引入了多项并发新特性,显著提升了编程效率。本文重点探讨了LongAdder和StampedLock的特性和应用场景。此外,还介绍了在多线程环境中发生死锁时,如何通过jps命令进行诊断和排查,提供了详细的步骤和示例。这些改进不仅增强了系统的性能,还简化了开发者的调试工作。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • 在解决区间相关问题时,我发现自己经常缺乏有效的思维方式,即使是简单的题目也常常需要很长时间才能找到解题思路,而一旦得到提示便能迅速理解。题目要求对一个包含n个元素的数组进行操作,并给出一个参数k,具体任务是…… ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 在C#中开发MP3播放器时,我正在考虑如何高效存储元数据以便快速检索。选择合适的数据结构,如字典或数组,对于优化性能至关重要。字典能够提供快速的键值对查找,而数组则在连续存储和遍历方面表现优异。根据具体需求,合理选择数据结构将显著提升应用的响应速度和用户体验。 ... [详细]
  • PyCharm 作为 JetBrains 出品的知名集成开发环境(IDE),提供了丰富的功能和强大的工具支持,包括项目视图、代码结构视图、代码导航、语法高亮、自动补全和错误检测等。本文详细介绍了 PyCharm 的高级使用技巧和程序调试方法,旨在帮助开发者提高编码效率和调试能力。此外,还探讨了如何利用 PyCharm 的插件系统扩展其功能,以满足不同开发场景的需求。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • Java中处理NullPointerException:getStackTrace()方法详解与实例代码 ... [详细]
author-avatar
漂亮的花裙子
这个家伙很懒,什么也没留下!
RankList | 热门文章