Java反序列化前置
0x01 前言
发现还是挺多东西不一样的,包括一个很简单的dnslog链子都需要很多前置知识
0x02 question
序列化与反序列化
is?
一样的,同php
一般,序列化就是将对象转换为易存储传输的形式,而反序列化就是把这种形式给重新转换成对象,不过Java
同php
不同,php
是转化为了常见的json
字符串,而Java是直接转换成了字节流的形式
why?
在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用此对象。但是,我们创建出来的这些对象都存在于JVM中的堆(heap)内存中,只有JVM处于运行状态的时候,这些对象才可能存在。一旦JVM停止,这些对象也就随之消失;
但是在真实的应用场景中,我们需要将这些对象持久化下来,并且在需要的时候将对象重新读取出来,Java的序列化可以帮助我们实现该功能。
how?
怎么去实现,其实这个东西,我们有很多种方式\接口,我们慢慢看一个最简单的例子
Person.java
1 | package demo; |
声明一个类,接口是serializable
,其中重写了toString
方法,写一个构造方法来处理参数,注意这个方法必须和类名相同
FileOutputStream
一个类用于将字节流写入文件
ObjectOutputStream
一个类用于将对象转换为字节流
File
对象主要用于表示文件和目录路径,但不会立即创建文件。
1 | package demo; |
你们看得懂吗,反正我是没看懂,和AI对线了一会终于理解了
- **
new FileOutputStream(file)
**:创建一个FileOutputStream
对象,这个对象表示一个可以将字节数据写入文件的字节流。 - **
new ObjectOutputStream(new FileOutputStream(file))
**:ObjectOutputStream
通过FileOutputStream
将对象转换为字节流并写入文件。
哦那会不会有个疑问就是说为啥已经是字节流的对象了还需要转换为字节流
Java 在处理文件的读写操作时,主要是通过字节流(
InputStream
和OutputStream
及其子类)来实现的。字节流是最基础的 I/O 操作方式,适用于处理二进制数据。
所以第一步FileOutputStream
就相当于是一个普通文件,第二步ObjectOutputStream
才是序列化
1 | package demo; |
那么刚才的两个类是输入的字节流,现在这两个就正好相反是输出流
- **
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.