什么是序列化与反序列化?
在计算机科学中,序列化(Serialization)指的是将数据结构或对象状态转换成字节流,以便存储或传输。而反序列化(Deserialization)则是将字节流还原成相应的数据结构或对象状态的过程。
简单来说,序列化就是将一个对象转换为二进制流的过程,反序列化则是将这个二进制流转换为原来的对象。序列化和反序列化可以实现对象的持久化、网络传输等操作,使得对象可以在不同的系统之间进行通信或保存到硬盘中。
举个例子,假设我们有一个Person类:
```java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getters and setters
}
```
现在我们想把一个Person对象序列化成二进制流,并保存到硬盘中,可以使用Java提供的序列化工具ObjectOutputStream:
```java
import java.io.*;
public class SerializationDemo {
public static void main(String[] args) {
try {
// create a Person object
Person person = new Person("Tom", 25);
// serialize the object to a file
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(person);
out.close();
fileOut.close();
System.out.println("Serialized data is saved in person.ser");
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
这段代码会将Person对象序列化成二进制流,并保存到person.ser文件中。
反序列化则需要使用ObjectInputStream:
```java
import java.io.*;
public class DeserializationDemo {
public static void main(String[] args) {
try {
// deserialize the object from a file
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
Person person = (Person) in.readObject();
in.close();
fileIn.close();
// print out the deserialized object's info
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
```
这段代码会从person.ser文件中读取二进制流,并将其反序列化为一个Person对象。最后我们可以打印出这个对象的信息。
需要注意的是,只有实现了Serializable接口的类才能被序列化。否则会抛出NotSerializableException异常。
另外,序列化和反序列化过程中可能会遇到一些问题,比如版本不兼容、安全性问题等。因此在实际应用中需要仔细考虑序列化和反序列化的实现方式和场景。