Java 序列化与反序列化:简单易懂的介绍
在 Java 编程中,序列化和反序列化是一种常见且重要的数据处理方式。它们能够让我们将对象转换成字节流,或者将字节流转换回对象。本文将以通俗易懂的方式,向大家介绍 Java 序列化与反序列化的原理和用法。
什么是序列化?
序列化是指将对象转换成字节流的过程。当我们需要将一个对象存储到硬盘或通过网络传输时,需要将其序列化。在 Java 中,我们可以使用 Serializable 接口来实现对象的序列化。该接口是一个标记接口,没有任何方法,但是告诉编译器这个类可以被序列化。
下面是一个示例代码,展示了如何实现 Serializable 接口:
```java
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
// 构造函数、getter和setter省略
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
```
在上面的例子中,我们定义了一个 Person 类,并实现了 Serializable 接口。这样,Person 对象就可以被序列化了。
如何进行序列化?
通过 Java 的 ObjectOutputStream 类,我们可以将对象序列化为字节流。下面是一个简单的示例代码,展示了如何把 Person 对象序列化,并存储到文件中:
```java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("Tom", 25);
try (FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(person);
System.out.println("对象已经被序列化并保存到 person.ser 文件");
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
在上面的代码中,我们创建了一个 Person 对象并将其保存到 `person.ser` 文件中。通过 `ObjectOutputStream` 的 `writeObject` 方法,我们可以将对象写入字节流中。
什么是反序列化?
反序列化是指将字节流转换为对象的过程。当我们需要从硬盘或网络中恢复一个对象时,需要进行反序列化。在 Java 中,我们可以使用 ObjectInputStream 类来实现对象的反序列化。
下面是一个简单的示例代码,展示了如何从文件中读取字节流,并将其反序列化成 Person 对象:
```java
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializationExample {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Person person = (Person) in.readObject();
System.out.println("从 person.ser 文件中反序列化出的对象:" + person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
```
在上述代码中,我们从 `person.ser` 文件中读取字节流,并使用 `ObjectInputStream` 的 `readObject` 方法将其反序列化为一个 Person 对象。
需要注意的是,在进行反序列化时,Java 会校验对象类的 serialVersionUID。如果类的 serialVersionUID 与字节流中的 serialVersionUID 不一致,就会抛出 `InvalidClassException` 异常。为了避免这个问题,我们可以手动指定 serialVersionUID,例如:
```java
private static final long serialVersionUID = 1L;
```
总结
通过本文的介绍,我们了解了 Java 序列化与反序列化的原理和用法。序列化可以让我们将对象转换成字节流,并存储到文件或传输到其他地方;反序列化则可以将字节流转换回对象,实现对象的恢复。这两种操作在 Java 编程中非常常见和重要,希望本文对大家有所帮助。