JAVA反序列化基础

JAVA原生序列化与反序列化

序列化与反序列化:

JAVA序列化是指把java对象转换为字节序列的过程,而java反序列化是指把字节序列恢复为java对象的过程。

序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一个部分,将数据分解成字节流,以便储存在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据有恢复数据的对象实例。

为什么要序列化与反序列化:

我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等,而这些数据都会以二进制序列的形式在网络上传送。当两个java进程进行通信时,实现进程间的对象传送需要java序列化与反序列化。一方面,发送方需要把这个java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出java对象。

通过序列化可以把数据永久地保存在硬盘上,利用序列化还能实现远程通信。

几种常见的序列化和反序列化协议

XML&SOAP:XML是一种常用的序列化和反序列化协议,具有跨机器,跨语言的优点,SOAP(Simple Object Access Protocol)是一种被广泛应用的,基于XML为序列化和反序列化协议的结构化消息传递协议

JSON(Javascript Object Notation)

Protobuf

序列化的实现

只有实现了Serializeble或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常)

Person.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.Serializable;

public class Person implements Serializable { //实现Serializable接口
private String name;
private int age;

public Person(){

}
public Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString(){
return "Person{"+
"name='" + name + '\''+
", age=" + age +
'}';
}
}
//一个实现serializeble接口的子类也是可以被序列化的。
//静态成员变量是不能序列化的:序列化是针对对象属性的,而静态成员变量是属于类的。
//transient标识的成员变量不参与序列化

SerializeTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class serializeTest{
public static void serialize(Object obj) throws Exception{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
oos.writeObject(obj);
}
public static void main(String[] args) throws Exception{
Person person = new Person("aa",22);
System.out.println(person);
serialize(person);
}
}
//ObjectOutputStream代表对象输出流:
//它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节写到一个目标输出流中

UnserializeTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;

public class UnserializeTest {
public static Object unserialize(String fileName) throws IOException,ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
Object obj = ois.readObject();
return obj;
}
public static void main(String[] args) throws Exception {
Person person = (Person)unserialize("ser.bin");
System.out.println(person);
}
}
//ObjectInputStream代表对象输入流:
//它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

JAVA反序列化基础
http://example.com/2024/07/04/JAVA反序列化基础/
作者
piiick
发布于
2024年7月4日
许可协议