当前位置: 首页 > news >正文

JavaSE -- 对象序列化和反序列化详细讲解

3. 对象序列化和反序列化

我在 Java 里面操作的对象都是存储在内存里面,当我们电脑关机这些对象就会丢失,如果要永久的保存(游戏存档)则必须远程传输到网络上或者保存到硬盘上,此时就需要使用对象序列化。当你要再次使用时,使用反序列化从文件或者网络中取出来。

注意:对象能够序列化和反序列化,一定要让对象实现下面两个接口中的一个

  • Serializable
  • Externalizable
3.1 对象序列化

使用 ObjectOutputStream 进行对象序列化

  • 实现 Serializable 接口

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 执行对象序列化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2 对象反序列化

通过使用 ObjectInputStream 将文件或者网络中的字节序列恢复成 Java 对象的过程

  • 简单使用(有错误)

    这样直接序列化是有点问题得,因为要成功反序列化的前提是序列化和反序列化使用的序列化版本是一样的 ,不然会报错的。为了避免这个错误我们应该自己手动指定对象序列化版本号

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 解决错误

    我们只要手动的加上这个序列化版本号(serialVersionUID)就可以了。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

加入下面设置,就可以让 Idea 提醒你加上序列化版本号再去执行序列化,同时只要你点一下警告位置会自动生成一个序列化版本号

3.3 序列化应该注意的问题
  • 当要执行序列化的对象的属性中有引用类型,该引用类型也要实现 Serializable 接口,不然会序列化失败
  • 但是当我们引用的对象不是我们自己编写的无法修改代码,此时我们应该给该引用类型加上一个 transient 的标记,这样序列化是就会忽略掉该属性

  • 对象的类名,属性名和属性值都会被序列化,而方法,static 属性,transient 属性不会被序列化
3.4 使用 Externalizable 实现序列化和反序列化

ExternalizableSerializable 的子接口,要使用他则同样需要实现 Externalizable 接口,重写WriteExternal 和 ReadExternal 方法。可以自定义序列化过程。 static 和 transient 修饰变量也可以被序列化

在使用 Externalizable 执行序列化之前,我先说一下 Serializable 不足之处有哪些

  • 序列化过程是递归,相对较慢
  • 对于需要禁止序列化的属性,需要一个个加上 transient 关键修饰符,当属性较多时,比较繁琐
  • 序列化和反序列化过程,中无法控制字段的序列化和反序列化方式
  • 序列化过程中没有调用构造方法,当一些业务逻辑需要构造方法的参与时,Serializable 无法满足
  1. 实现接口和指定序列化版本和 Serializable 一样都要写

  2. 重写 writeExternal()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 重写 ReadExternal()

  1. 使用 ObjectOutputStream 执行序列化的方法和 Serializable 一样
http://www.dtcms.com/a/286693.html

相关文章:

  • HarmonyOS-ArkUI Web控件基础铺垫4--TCP协议- 断联-四次挥手解析
  • 全国计算机等级考试二级题库【C语言】:程序修改题型——结构体、可变数组、链表 自制答案详解合辑
  • 深度学习入门-深度学习简介
  • 屏显智能电子锁语音芯片方案新选择
  • Hinge Loss(铰链损失函数)详解:SVM 中的关键损失函数
  • C++实现单层时间轮
  • UE5网络联机函数
  • RSTP技术
  • Thread,ThreadLocal,ThreadLocalMap 三者的关系, 以及在实际开发中的应用【AI记录用】
  • mysql复制延迟如何处理
  • js中的微任务和宏任务的理解
  • python 实现将文件的非零数据扇区进行提取,并以偏移地址进行命名保存
  • AI(day10)模块化编程概念(模块、包、导入)及常见系统模块总结和第三方模块管理
  • AE PDW2200电源射频手侧使用安装说明含电路图
  • 70 gdb attach $pid, process 2021 is already traced by process 2019
  • 反序列化漏洞3-反序列化漏洞讲解演示
  • 4. PyQGIS整体框架详解
  • Agent AI(3):Agent分类
  • day30——零基础学嵌入式之线程2.0
  • 多线程-2-线程间通信
  • 推荐算法召回:架构理解
  • 【RK3576】【Android14】开发环境搭建
  • Windows 下 VS2019 编译 libevent-2.1.10 库
  • React 实现人员列表多选、全选与取消全选功能
  • 大疆司空2私有化部署报错解决方案
  • 谷歌浏览器Chrome的多用户配置文件功能
  • Python分组柱形图绘制全攻略
  • 题解:CF1866D Digital Wallet
  • 熔断和降*的区别
  • 使用pt-toolkit工具包进行MySQL性能优化实战指南