Java-序列化与反序列化

序列化和反序列化的应用:

两个进程在远程通信时,可以发送多种数据,包括文本、图片、音频、视频等,这些数据都是以二进制序列的形式在网络上传输。

java 是面向对象的开发方式,一切都是 java 对象,想要在网络中传输 java 对象,可以使用序列化和反序列化去实现,发送发需要将 java 对象转换为字节序列,然后在网络上传送,接收方收到字符序列后,会通过反序列化将字节序列恢复成 java 对象。

java 序列化的优点:

  • 实现了数据的持久化,通过序列化可以把数据持久地保存在硬盘上 (磁盘文件)。
  • 利用序列化实现远程通信,在网络上传输字节序列

原生序列化操作

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

public class Main{
public static void main(String[] args) throws IOException {
Person p = new Person("haohao", 18, 14);
System.out.println(p);
SerializableDeamo(p);
}
public static void SerializableDeamo(Person obj) throws IOException {
//FileOutputStream()输出文件
//将对象obj序列化后输出到文件person.txt
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.txt"));
oos.writeObject(obj);
}
}

Person.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Person  {
private String name;
private int age;
private String years;

public Person(String name, int age, int years) {
this.name = name;
this.age = age;
this.age = years;
System.out.println(name + " " + age + " " + years);
}


public String toString() {
String s = "Name: " + name + " Age: " + age + " Years: " + age;
return s;
}

}

反序列化:

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

public class UnserializableDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Object obj = unserializeTest("person.txt");
System.out.println(obj);
}

public static Object unserializeTest(String filename) throws IOException, ClassNotFoundException {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename))) {
return ois.readObject();
}
}
}