Java 序列化与反序列化

文章目录

  • Java 序列化与反序列化
    • 1 序列化与反序列化的概念
    • 2 核心类与关键字总览
    • 3 序列化与反序列化的过程
    • 3 应用示例
    • 4 序列化版本号的作用 serialVersionUID
    • 5 transient 关键字
    • 6 序列化的好处及应用场景
    • 7 序列化注意事项

1 序列化与反序列化的概念

  • Java 序列化是指:将对象转化成一个字节序列(二进制数据)的过程。

  • 将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化。

  • Java 反序列化是指:将一个对象的字节序列恢复成 Java 对象的过程。

  • 一个平台中序列化的对象,可以在另一个平台中进行反序列化,因为这个过程是在 JVM 中独立完成的,可以依赖于 Java 的可移植性。


2 核心类与关键字总览

  • ObjectOutputStream:IO 类,包含序列化对象的方法,writeObject()

  • ObjectInputStream:IO 类,包含反序列化对象的方法,readObject()

  • 上面两个 IO 流类是高层次的数据库,需要借助文件流进行序列化与反序列化操作。

  • Serializable ,接口,是一个标志性接口,标识可以在 JVM 中进行序列化,JVM 会为该类自动生成一个序列化版本号。参与序列化与反序列化的类必须实现 Serializable 接口。

  • serialVersionUID,类属性,序列化版本号,用于给 JVM 区别同名类,没有提供版本号,JVM会默认提供序列化版本号。

  • transient,关键字,当序列化时,不希望某些属性参与,则可以使用这个关键字标注该属性。


3 序列化与反序列化的过程

  • 内存中的数据信息被拆分成一小块一小块的部分,为每个小块设置编号,然后存放到硬盘文件中,也就是将 Java 对象对象的状态保存下来存储到文件中的过程就叫做序列化。

  • 将硬盘中保存了 Java 对象状态的字节序列按照编号组装成对象恢复到内存中,这个过程称为反序列化。


3 应用示例

参与序列化和反序列化的 Java 类

public class Student implements Serializable {private String name;private int age;//  以下省略有参构造、无参构造、set、get、toString
}
  • 参与序列化和反序列化的类必须实现 Serializable 接口。

序列化操作

public static void main(String[] args) throws Exception {//  创建 Java 对象Student student = new Student("张三",22);//  对象输出流ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student"));// 使用 writeObject 序列化对象oos.writeObject(student);// 刷新oos.flush();//  关闭流oos.close();
}
  • 序列化后的二进制文件会被保存到文件输出流指定的路径。

反序列化操作

public static void main(String[] args) throws Exception {//  对象输入流ObjectInputStream ois = new ObjectInputStream(new FileInputStream("student"));//  使用 readObject() 反序列化  Object obj = ois.readObject();//  使用对象System.out.println(obj);//  关闭流ois.close();
}
  • 反序列化需要借助文件输入流读取指定路径的二进制文件。

4 序列化版本号的作用 serialVersionUID

  • JVM 首先会通过类名来区分 Java 类,类名不同,则不是同一个类。当类名相同时,JVM 就会通过序列化版本号来区分 Java 类,如果序列化版本号相同就为同一个类,序列化版本号不同就为不同的类。

  • 在序列化一个对象时,如果没有指定序列化版本号,后期对该类的源码进行修改并重新编译后,会导致修改前后的序列化版本号不一致,因为 JVM 会提供一个新的序列化版本号给该类对象。

  • 此时再用以往的反序列化代码去反序列化该类的对象,就会抛出异常 java.io.InvalidClassException ,所以序列化一个类时最好指定一个序列化版本号,或者永远不修改此类。

public class Student implements Serializable {private static final Long serialVersionUID = 1L;
}
  • 由 JVM 提供序列化版本号的好处是,同名却不同功能的类,会有两个不同的序列化版本号,JVM 可以通过序列化版本号加以区分,缺点是一旦修改源码,会重新提供序列化版本号,导致修改前后的序列化版本号不一致,进行反序列化时会出现运行出现异常。

  • 由 开发人员 手动提供序列化版本号的好处是,当修改了被序列化类的源码后,以往写的反序列化代码依然可以使用,如 JDK 中的 String 类。以便后期进行增强和维护不会影响使用。


5 transient 关键字

  • 这个关键字表示游离的,不参与序列化的。

  • 在序列化一个对象时,如果不希望某个属性参加序列化,可以使用 transient 修饰该属性。

  • 被该关键字修饰的属性不会参与到序列化中。

public class Student implements Serializable {private static final Long serialVersionUID = 1L;private String name;private transient int age;
}
  • 如上类,在序列化时就不会保存 age 属性,在反序列化时就不能会付出该属性,默认恢复成 null 或 0 ,由属性类型决定。

6 序列化的好处及应用场景

  • 序列化会将内存中对象的状态转换成二进制文件保存到磁盘当中,当再次使用时会从磁盘中读取该二进制文件,将 Java 对象的状态恢复到内存中。

  • 当你想把内存中的对象保存到磁盘文件或数据库中时可以使用序列化。

  • 当你想在网络传输中传送 Java 对象时,可以使用序列化。

  • 当你想通过 RMI 传输对象时,可以使用序列化。


7 序列化注意事项

  • 序列化只会保存对象的属性状态,不会保存对象中的方法。

  • 父类实现了 Serializable 接口,则其子类也自动实例化了该接口,也就是说子类不用显式实现 Serializable 接口也能参与序列化和反序列化。

  • 一个对象 A 的实例变量引用了其他对象 B,在 A 对象实例化的过程中 ,也会序列化 B ,前提是 A、B 两个类都实现了 Serializable 接口。

  • 当一个类实现 Serializable 接口时,最好手动指定一个序列化版本号(serialVersionUID),避免修改源代码后导致反序列化出现异常。

  • 当一个类对象会被多次重复使用,且一般不会对其属性做修改,就可以对其进行序列化。例如数据库操作中的实体类。


参考博文:

  • 菜鸟教程

  • 对Java Serializable(序列化)的理解和总结

  • java序列化,看这篇就够了

Java 序列化与反序列化相关推荐

  1. java 序列化概念和作用_结合代码详细解读Java序列化与反序列化概念理解

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  2. Java中如何引用另一个类里的集合_【18期】Java序列化与反序列化三连问:是什么?为什么要?如何做?...

    Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...

  3. java序列化与反序列化(转)

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  4. java序列化和反序列化以及序列化ID的作用分析

     java序列化和反序列化 一.概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象.对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一 ...

  5. java序列化和反序列化_Java恶意序列化背后的历史和动机

    java序列化和反序列化 与Java的序列化机制相关的问题已广为人知. 有效的Java 1st Edition (第10章)和有效的Java 2nd Edition (第11章)的整个最后一章都专门讨 ...

  6. 教你彻底学会Java序列化和反序列化

    Java序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程.反序列化:客户端重文件,或者网络中获取到文件以后,在内存中重构对象 ...

  7. 理论 | 教你彻底学会Java序列化和反序列化

    这是小小本周的第四篇 Java序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程.反序列化:客户端重文件,或者网络中获取到文件 ...

  8. Java序列化与反序列化(一)

    目录 序列化与反序列化 1.最简单的使用:Serializable 接口 2. 序列化 ID 的问题 3. 静态字段不会序列化 4. 屏蔽字段:transient 5. 父类的序列化 6. 自定义序列 ...

  9. Serializable详解(1):代码验证Java序列化与反序列化

    说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...

最新文章

  1. 大型分布式系统中的缓存架构
  2. numba.jit警告:failed type inference due to: non-precise type pyobject
  3. vue的指令绑定、事件、冒泡
  4. Binary Tree Postorder Traversal
  5. Caffe部署中的几个train-test-solver-prototxt-deploy等说明 (一)
  6. Oracle使用ini启动,python操作ini类型配置文件的实例教程
  7. 算法训练 最长字符串 java
  8. 顺序写磁盘比随机写内存_深入理解 linux磁盘顺序写、随机写
  9. (王道408考研数据结构)第七章查找-第三节:B树(基本概念及其操作)
  10. 开启人才进阶之旅,鲲鹏开发者技术沙龙点燃计算行业激情
  11. git推送项目到码云(gitee)
  12. CCF201703-5 引水入城(100分题解链接)
  13. Swift - 动画效果的实现方法总结(附样例)
  14. Comodo 龙浏览器下载
  15. springboot呼伦贝尔旅游网站的设计与实现毕业设计源码091833
  16. JAVA操作Excel(POI、easyPOI、easyExcel)
  17. H5 的直播协议和视频监控方案
  18. upload-labs攻略
  19. MFCXTP库读取和写入XML文件
  20. ajax nginx 转发 sessionid_百度、京东、网易、腾讯、淘宝等大厂都在用的Web服务器Nginx详解

热门文章

  1. 废物再利用 旧Android手机打造Web服务器
  2. DeepWeak: Reasoning Common Software Weaknesses via Knowledge Graph Embedding 阅读笔记
  3. 内部认购”行为有效吗?
  4. windowsXP获取权限
  5. php php 序列化方法,PHP序列化的4种方法已公布,这是你PHP进阶之路必会的
  6. Qt的QString类型
  7. 现已告别五险一金?迎来社保商保时代保险INSURAUNCE
  8. 民安智库开展珠海连锁快餐门店暗访调查
  9. 叮咚小区算什么社区O2O?
  10. 脑力风暴之小毛驴历险记(3)---低进高出的小鸡(上)