• java序列化与反序列化


    java中序列化与反序列化

    概念

    在Java中,序列化是指将对象转换为字节流的过程,而反序列化则是将字节流转换回对象的过程。序列化和反序列化通常用于在网络上传输对象或将对象持久化到磁盘上。

    要对一个对象进行序列化,可以使用ObjectOutputStream类。该类提供了writeObject()方法,可以将对象转换为字节流并写入到输出流中。

    要对一个字节流进行反序列化,可以使用ObjectInputStream类。该类提供了readObject()方法,可以从输入流中读取字节流并转换为对象。

    序列化:
    ObjectOutputStream --> writeObject()
    反序列化: 
    ObjectInputStream --> readObject()  
    
    • 1
    • 2
    • 3
    • 4

    什么是反序列化漏洞

    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);
                }
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    person

    import java.io.Serializable;
    
    public class person implements Serializable {
        public String name="order";
        public int age=20;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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");
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    然后会在当前目录生成一个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"));
    
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    反序列化结果如图

    image-20231122190444785

  • 相关阅读:
    MyBatis笔记——参数处理
    20个最佳实践提升Terraform工作流程|Part 2
    MySQL索引详解
    与AI对话的艺术:如何优化Prompt以获得更好的响应反馈
    算子开发入门系列(一)
    人在囧途,你该怎么办?
    与传统IT开发相比,低代码平台有何优势?
    Java Web笔记 cookie
    计算机毕业设计 SSM家具销售系统 家具店管理系统 家具商城系统Java
    内网渗透之Windows认证(二)
  • 原文地址:https://blog.csdn.net/qq_58683895/article/details/134560403