概念:

序列化就是将内存中的某个对象压缩为字节流的形式。
反序列化就是讲字节流转化成内存中的对象。
反序列化会执行额外的一些操作,从而导致不安全。

如何序列化类

Java代码中一个对象(类)如果要序列化和反序列化需要实现java.io.Serializable接口。未实现此接口的类将不会对其任何状态进行序列化或反序列化。

  1. @Data
  2. public class BusPolicenoDnseg implements Serializable {
  3. private static final long serialVersionUID = 575289654364238854L;
  4. private Integer delFlag;
  5. private String name;
  6. }

点进java.io.Serializable接口,会发现是一个空接口,说明其作用只是为了在序列化和反序列化中做一个类型判断。为什么呢?因为为了遵循非必要原则,不需要序列化的类就可以不用序列化了。
image.png

Java原生实现了一套序列化的机制,它让我们不需要额外编写代码,只需要实现java.io.Serializable接口,并调用objectOutputStream类中的writeObject方法即可。
跟进writeObject方法中,通过阅读源码得知,在序列化的过程中,是针对对象本身,而非针对类的,因此静态属性是不参与序列化和反序列化的过程。另外,如果属性本身声明了transient关键字,也会被忽略。但是如果某对象继承了A类,那么A类中的对象的对象属性也是会被序列化和反序列化的(前提是A类页实现了java.io.Serializable接口)

  1. import java.io.FileOutputStream;
  2. import java.io.IOException;
  3. import java.io.ObjectOutputStream;
  4. /**
  5. * @author Created by yinrg on 2022年3月10日,0010 下午 03:23
  6. * @fileSimpleName SerializationDemo
  7. * @fileName com.java.SerializationDemo
  8. * @description
  9. */
  10. public class SerializationDemo {
  11. public static void main(String[] args) throws IOException {
  12. Book book = new Book();
  13. ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("ser.ser"));
  14. objectOutputStream.writeObject(book);
  15. objectOutputStream.close();
  16. }
  17. }