Java反序列化前置

baozongwi Lv5

0x01 前言

发现还是挺多东西不一样的,包括一个很简单的dnslog链子都需要很多前置知识

0x02 question

序列化与反序列化

is?

一样的,同php一般,序列化就是将对象转换为易存储传输的形式,而反序列化就是把这种形式给重新转换成对象,不过Javaphp不同,php是转化为了常见的json字符串,而Java是直接转换成了字节流的形式

why?

在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用此对象。但是,我们创建出来的这些对象都存在于JVM中的堆(heap)内存中,只有JVM处于运行状态的时候,这些对象才可能存在。一旦JVM停止,这些对象也就随之消失;

但是在真实的应用场景中,我们需要将这些对象持久化下来,并且在需要的时候将对象重新读取出来,Java的序列化可以帮助我们实现该功能。

how?

怎么去实现,其实这个东西,我们有很多种方式\接口,我们慢慢看一个最简单的例子

Person.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package demo;

import java.io.*;

public class Person implements Serializable{
private String name;
private int age;

public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return this.name+"他"+this.age;
}
}

声明一个类,接口是serializable,其中重写了toString方法,写一个构造方法来处理参数,注意这个方法必须和类名相同

FileOutputStream一个类用于将字节流写入文件

ObjectOutputStream一个类用于将对象转换为字节流

File 对象主要用于表示文件和目录路径,但不会立即创建文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package demo;
import java.io.*;

public class ObjectOutputStreamDemo {
public static void main(String[] args) throws Exception{
File file =new File("./test.txt");
ObjectOutputStream oos=null;
/**创建字节流对象*/
oos =new ObjectOutputStream(new FileOutputStream(file));
/**写入类*/
Person per =new Person("baozongwi",18);
oos.writeObject(per);
oos.close();
}
}

你们看得懂吗,反正我是没看懂,和AI对线了一会终于理解了

  • **new FileOutputStream(file)**:创建一个 FileOutputStream 对象,这个对象表示一个可以将字节数据写入文件的字节流。
  • **new ObjectOutputStream(new FileOutputStream(file))**:ObjectOutputStream 通过 FileOutputStream 将对象转换为字节流并写入文件。

哦那会不会有个疑问就是说为啥已经是字节流的对象了还需要转换为字节流

Java 在处理文件的读写操作时,主要是通过字节流(InputStreamOutputStream 及其子类)来实现的。字节流是最基础的 I/O 操作方式,适用于处理二进制数据。

所以第一步FileOutputStream就相当于是一个普通文件,第二步ObjectOutputStream才是序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
package demo;
import java.io.*;

public class ObjectInputStreamDemo {
public static void main(String[] args) throws Exception{
File file =new File("./test.txt");
ObjectInputStream ois=null;
ois =new ObjectInputStream(new FileInputStream(file));
Person per =(Person) ois.readObject();
System.out.println(per);

}
}

那么刚才的两个类是输入的字节流,现在这两个就正好相反是输出流

  • **new FileInputStream(file)**:创建一个 FileInputStream 对象,用于从文件中读取字节数据。
  • **new ObjectInputStream(new FileInputStream(file))**:创建一个 ObjectInputStream 对象,将 FileInputStream 作为参数传递给它。ObjectInputStream 用于从字节流中读取对象。

serializable

  • Title: Java反序列化前置
  • Author: baozongwi
  • Created at : 2024-10-06 16:46:24
  • Updated at : 2024-10-07 21:44:04
  • Link: https://baozongwi.xyz/2024/10/06/Java反序列化前置/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments