java序列化与反序列化

本文详细讲解Java中序列化/反序列化机制,包括ObjectOutputStream.writeObject()和ObjectInputStream.readObject(),并提到了潜在的反序列化漏洞案例。
摘要由CSDN通过智能技术生成

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文件

查看内容为序列化的结果

image-20231122190204725

反序列化时

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"));


    }

}

反序列化结果如图

image-20231122190444785

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值