当前位置: 首页 > 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.xdnf.cn/news/1142389.html

相关文章:

  • springCloud -- 微服务01
  • H3CNE小小综合实验
  • Linux C 进程间通信基本操作
  • Flutter 多语言(国际化)入门教程
  • 【Flutter】深入理解 Provider:不仅仅是Consumer
  • MySQL:数据类型
  • Java大厂面试实录:从Spring Boot到AI微服务架构的深度拷问
  • 开源的大语言模型(LLM)应用开发平台Dify
  • Ubuntu系统下编译安装FreeSWITCH 1.10.12
  • 指定阿里镜像原理
  • 工业数据集成中间件工具OPC Router详细介绍
  • Redis原理之哨兵机制(Sentinel)
  • [Linux]如何設置靜態IP位址?
  • Unity 堆栈分析实战指南 C#
  • wx小程序设置沉浸式导航文字高度问题
  • HIVE实战处理(二十四)留存用户数
  • Web3+AI融合新纪元:Sollong用智能终端重塑协作计算未来
  • 区别下IO多路复用,reactor,事件循环(EventLoop),Epoll这几个的概念以及之间的关系
  • 文献分享0719
  • 大数据时代下的时序数据库选型指南:基于工业场景的IoTDB技术优势与适用性研究
  • 脚手架本地link标准流程
  • 在 OpenSUSE Tumbleweed 和 Leap 上安装 VirtualBox
  • 【Linux】环境基础与开发工具的使用
  • x86上编译jetson nano的docker
  • Nestjs框架: 基于TypeORM的多租户功能集成
  • Android性能优化之网络优化
  • 分布式面试点
  • 在云端解锁硬件的无限可能 —— 深圳航天科技创新研究院赋能新一代仿真教学平台
  • Zabbix安装-Server
  • 低代码开发实践博客