转载地址:https://www.cnblogs.com/ysocean/p/6870069.html

1、什么是序列化与反序列化?

  序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。这个过程称为序列化。通俗来说就是将数据结构或对象转换成二进制串的过程

  反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

2、为什么要做序列化?

  ①、在分布式系统中,此时需要把对象在网络上传输,就得把对象数据转换为二进制形式,需要共享的数据的 JavaBean 对象,都得做序列化。

  ②、服务器钝化:如果服务器发现某些对象好久没活动了,那么服务器就会把这些内存中的对象持久化在本地磁盘文件中(Java对象转换为二进制文件);如果服务器发现某些对象需要活动时,先去内存中寻找,找不到再去磁盘文件中反序列化我们的对象数据,恢复成 Java 对象。这样能节省服务器内存。

3、Java 怎么进行序列化?

  ①、需要做序列化的对象的类,必须实现序列化接口:Java.lang.Serializable 接口(这是一个标志接口,没有任何抽象方法),Java 中大多数类都实现了该接口,比如:String,Integer

  ②、底层会判断,如果当前对象是 Serializable 的实例,才允许做序列化,Java对象 instanceof Serializable 来判断。

  ③、在 Java 中使用对象流来完成序列化和反序列化

    ObjectOutputStream:通过 writeObject()方法做序列化操作

    ObjectInputStream:通过 readObject() 方法做反序列化操作

    

 第一步:创建一个 JavaBean 对象

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public class Person implements Serializable{

    private String name;

    private int age;

    

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    @Override

    public String toString() {

        return "Person [name=" + name + ", age=" + age + "]";

    }

    public Person(String name, int age) {

        super();

        this.name = name;

        this.age = age;

    }

}  

 第二步:使用 ObjectOutputStream 对象实现序列化

1

2

3

4

5

6

//在根目录下新建一个 io 的文件夹

        OutputStream op = new FileOutputStream("io"+File.separator+"a.txt");

        ObjectOutputStream ops = new ObjectOutputStream(op);

        ops.writeObject(new Person("vae",1));

        

        ops.close();

  我们打开 a.txt 文件,发现里面的内容乱码,注意这不需要我们来看懂,这是二进制文件,计算机能读懂就行了。

错误一:如果新建的 Person 对象没有实现 Serializable 接口,那么上面的操作会报错:

    

第三步:使用ObjectInputStream 对象实现反序列化

  反序列化的对象必须要提供该对象的字节码文件.class

1

2

3

4

5

6

7

InputStream in = new FileInputStream("io"+File.separator+"a.txt");

        ObjectInputStream os = new ObjectInputStream(in);

        byte[] buffer = new byte[10];

        int len = -1;

        Person p = (Person) os.readObject();

        System.out.println(p);  //Person [name=vae, age=1]

        os.close();

  

问题1:如果某些数据不需要做序列化,比如密码,比如上面的年龄?

解决办法:在字段面前加上 transient

1

2

private String name;//需要序列化

    transient private int age;//不需要序列化

  那么我们在反序列化的时候,打印出来的就是Person [name=vae, age=0],整型数据默认值为 0

问题2:序列化版本问题,在完成序列化操作后,由于项目的升级或修改,可能我们会对序列化对象进行修改,比如增加某个字段,那么我们在进行反序列化就会报错:

解决办法:在 JavaBean 对象中增加一个 serialVersionUID 字段,用来固定这个版本,无论我们怎么修改,版本都是一致的,就能进行反序列化了

1

private static final long serialVersionUID = 8656128222714547171L;

序列化的作用、实现、场景相关推荐

  1. java序列化的作用

    java序列化的作用 1.序列化是干什么的?        简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法 ...

  2. [转载] Java序列化的几种方式以及序列化的作用

    参考链接: Java中带有继承的对象序列化 文章转载自:  本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用 有的时候我们想要把一个 ...

  3. Java序列化的几种方式以及序列化的作用(文章有所改变)

    本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用    有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从 ...

  4. JAVA中序列化的作用以及好处

    1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比 ...

  5. java里面序列化作用_java中序列化的作用

    一  什么叫序列化 通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输. 二 序列化有什么作用 1.方便传输,速度快,还很安全,被调用方序列化,调用方反 ...

  6. 机器学习——标准化/归一化的目的、作用和场景

    对每个特征进行归一化处理,使得每个特征的取值缩放到0~1之间.这样做有两个好处: 模型训练更高效. 特征前的权重大小可代表该变量对预测结果的贡献度(因为每个特征值本身的范围相同). (一)归一化的作用 ...

  7. 序列化的作用_Java 序列化的高级认识

    引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口, ...

  8. java序列化有什么用_java中序列化的作用

    一  什么叫序列化 通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输. 二 序列化有什么作用 1.方便传输,速度快,还很安全,被调用方序列化,调用方反 ...

  9. java中序列化的作用

    一  什么叫序列化 通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输. 二 序列化有什么作用 1.方便传输,速度快,还很安全,被调用方序列化,调用方反 ...

最新文章

  1. NHibernate之Mapping 之 Property
  2. Php的基本语法学习
  3. php函数get和set,php中外部类调用_get函数和_set函数的方法
  4. 【数据结构与算法】之深入解析“二叉树的后序遍历”的求解思路与算法示例
  5. C++中socket编程
  6. html中post和get区别
  7. 美一好创始人驾驶蔚来ES8启用自动驾驶后发生交通事故不幸逝世
  8. 背部辨识度极高!红米K30系列将率先采用高通5G处理器
  9. 常用STL整理 (施工中 2017.8.11更新)
  10. RedHat发布JBoss 7.2,完全支持Java EE 8规范
  11. qgraphicsview鼠标移动图片_QGraphicsView中的QGraphicsItem鼠标拖动
  12. 【交易技术前沿】低时延基础设施杂谈
  13. [996]如何申请高德地图用户Key
  14. PON系统基础知识简介
  15. 字体凹陷效果html,在PS中,想做凹进去的效果,怎么做?例如文字凹进木板中?...
  16. php 读取解析excel文件内容,怎么用PHP读取Excel文件信息及内容?(图文+视频教程)...
  17. House of apple 一种新的glibc中IO攻击方法
  18. excel 合并多个工作表,保留列宽等格式
  19. 码农干货系列【10】--光线追踪进阶:javascript玩转3D纹理映射
  20. 达人评测 i5 13400和i5 12600K选哪个好

热门文章

  1. 常用的爆款抓包工具综合对比(选择最合适的抓包工具才是最重要的!)
  2. java基础学习笔记(面向对象编程)
  3. 机械行业ERP系统实施能成功吗?
  4. Output 0 of UnbindBackward is a view and is being modified inplace
  5. 依靠追词获得百万流量之“什么是追词”
  6. 2009.4.22 speak2me笔记
  7. springboot 论坛项目
  8. Audio File Format Specifications
  9. ABP(ASP.NET Boilerplate Project)快速入门
  10. CVE-2014-0160 Heartbleed Bug