java中序列化与反序列化
概念
在Java中,序列化是指将对象转换为字节流的过程,而反序列化则是将字节流转换回对象的过程。序列化和反序列化通常用于在网络上传输对象或将对象持久化到磁盘上。
要对一个对象进行序列化,可以使用ObjectOutputStream类。该类提供了writeObject()方法,可以将对象转换为字节流并写入到输出流中。
要对一个字节流进行反序列化,可以使用ObjectInputStream类。该类提供了readObject()方法,可以从输入流中读取字节流并转换为对象。
序列化:
ObjectOutputStream --> writeObject()
反序列化:
ObjectInputStream --> readObject()
什么是反序列化漏洞
java中的反序列化漏洞,由于开发者重写了readobject()方法,在该方法里面存在执行代码,在重写的readobject()方法中执行了链式调用,最终执行到了危险函数的位置
代码演示
先定义类 serialize,deserialize,test1,person
代码中如果报错,一般为没有导包,鼠标点过去然后alt+enter即可
serialize
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class serialize implements Serializable {public static void serialize1(Object obj, String filePath) throws IOException {try (FileOutputStream fileOut = new FileOutputStream(filePath);ObjectOutputStream objectOut = new ObjectOutputStream(fileOut)){objectOut.writeObject(obj);}}}
deserialize
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;public class deserialize implements Serializable {public static Object deserialize1(String filePath) throws IOException, ClassNotFoundException {try (FileInputStream fileIn = new FileInputStream(filePath);ObjectInputStream objectIn = new ObjectInputStream(fileIn)) {return objectIn.readObject();}}
}
person
import java.io.Serializable;public class person implements Serializable {public String name="order";public int age=20;}
test1
序列化时
import java.io.*;
public class test1 {public static void main(String[] args) throws IOException, ClassNotFoundException {person person1=new person();serialize seri=new serialize();serialize.serialize1(person1,"order.bin");}}
然后会在当前目录生成一个order.bin文件
查看内容为序列化的结果
反序列化时
import java.io.*;
public class test1 {public static void main(String[] args) throws IOException, ClassNotFoundException {person person1=new person();deserialize seri1=new deserialize();System.out.println("反序列化结果:" + deserialize.deserialize1("order.bin"));}}
反序列化结果如图