概念:
序列化就是将内存中的某个对象压缩为字节流的形式。
反序列化就是讲字节流转化成内存中的对象。
反序列化会执行额外的一些操作,从而导致不安全。
如何序列化类
Java代码中一个对象(类)如果要序列化和反序列化需要实现java.io.Serializable接口。未实现此接口的类将不会对其任何状态进行序列化或反序列化。
@Data
public class BusPolicenoDnseg implements Serializable {
private static final long serialVersionUID = 575289654364238854L;
private Integer delFlag;
private String name;
}
点进java.io.Serializable接口,会发现是一个空接口,说明其作用只是为了在序列化和反序列化中做一个类型判断。为什么呢?因为为了遵循非必要原则,不需要序列化的类就可以不用序列化了。
Java原生实现了一套序列化的机制,它让我们不需要额外编写代码,只需要实现java.io.Serializable接口,并调用objectOutputStream类中的writeObject方法即可。
跟进writeObject方法中,通过阅读源码得知,在序列化的过程中,是针对对象本身,而非针对类的,因此静态属性是不参与序列化和反序列化的过程。另外,如果属性本身声明了transient关键字,也会被忽略。但是如果某对象继承了A类,那么A类中的对象的对象属性也是会被序列化和反序列化的(前提是A类页实现了java.io.Serializable接口)
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**
* @author Created by yinrg on 2022年3月10日,0010 下午 03:23
* @fileSimpleName SerializationDemo
* @fileName com.java.SerializationDemo
* @description
*/
public class SerializationDemo {
public static void main(String[] args) throws IOException {
Book book = new Book();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("ser.ser"));
objectOutputStream.writeObject(book);
objectOutputStream.close();
}
}