什么是序列化和反序列化

  • 序列化:指把堆内存中的java对象数据,通过某种方式把对象存储在磁盘文件中或者传递给其他网络节点,通俗来讲就是将数据结构或对象转换成字节序列(二进制串)的过程。
  • 反序列化:把磁盘文件中的对象数据或者网络节点上的对象数据,恢复成java对象模型的过程,也就是将在序列化过程中所生成的字节序列(二进制串)转换成数据结构或者对象的过程。

为什么要做序列化和反序列化

  • 在分布式系统中,此时需要把对象在网络上传输,就得把对象数据转换成二进制形式,需要共享的数据的JavaBean对象,都得做序列化。
  • 有些服务器发生钝化现象,如果服务器发现某些对象好久没活动了,那么服务器就把这些内存中的对象持久化在本地磁盘文件中(Java对象转换成二进制文件);如果服务器发现某些对象需要活动时,先去内存中寻找,找不到再去磁盘文件中反序列化我们的对象数据,恢复成java对象,这样能节省服务器内存。

怎么去做序列化和反序列化

  1. 需要做序列化的对象的类,必须实现序列化接口:java.lang.Serializable接口(这是一个标志接口,没有任何抽象方法),java中大多数类都实现了该接口,比如:String,Integer
  2. 底层会判断,如果当前对象是Serializable的实例,才允许做序列化,Java对象instanceof Serializable来判断。
  3. 在Java中使用对象流进行序列化和反序列化的操作
    • ObjectOutputStream:通过writeobject()方法做序列化操作。
    • ObjectInputStream:通过readobject()方法做反序列化操作。

具体操作步骤如下:

  1. 先建立一个Person类,继承与Serializable接口。
    ``` package bean;

import java.io.Serializable;

public class Person implements Serializable { private String name; private int age;

  1. public String getName() {
  2. return name;
  3. }
  4. public void setName(String name) {
  5. this.name = name;
  6. }
  7. public int getAge() {
  8. return age;
  9. }
  10. public void setAge(int age) {
  11. this.age = age;
  12. }
  13. @Override
  14. public String toString() {
  15. return "Person{" +
  16. "name='" + name + '\'' +
  17. ", age=" + age +
  18. '}';
  19. }
  20. public Person(String name, int age) {
  21. super();
  22. this.name = name;
  23. this.age = age;
  24. }

}

  1. 2. 进行编写SerializableTest类,进行序列化和反序列化的操作。

package io;

import bean.Person;

import java.io.*;

public class SerializableTest { public static void main(String[] args) throws IOException, ClassNotFoundException { //进行序列化 ObjectOutputStream ooo=new ObjectOutputStream((new FileOutputStream(“D:/data.txt”))); Person person=new Person(“zzzz”,1); ooo.writeObject(person); ooo.close();

  1. //进行反序列化
  2. ObjectInputStream oos=new ObjectInputStream(new FileInputStream("D:/data.txt"));
  3. Person person1=(Person)oos.readObject();
  4. System.out.println("name="+person1.getName()+" "+"age="+person1.getAge());
  5. oos.close();
  6. }

} ```