Java 序列化 是一种将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,对象序列化主要通过实现 java.io.Serializable
接口来实现。序列化后的对象可以保存到文件、数据库或通过网络传输。
什么是序列化?
序列化是将对象的状态信息转换为字节序列的过程,以便可以将其持久保存到磁盘或通过网络发送到其他计算机。序列化是对象持久化的一种方式。
什么是反序列化?
反序列化是序列化的逆过程,它将字节序列恢复为对象。
需要序列化的情况:
-
持久化:将对象的状态保存到文件或数据库中,以便以后可以恢复对象的状态。
-
远程传输:通过网络将对象从一个系统传输到另一个系统。
-
分布式系统:在分布式系统中,对象可能需要在不同的节点之间传输。
-
对象缓存:将对象序列化后保存,以便在需要时快速加载。
-
克隆对象:通过序列化可以实现对象的深拷贝。
实现序列化的步骤:
-
实现 Serializable 接口:让类实现
java.io.Serializable
接口。 -
定义 serialVersionUID:为了确保序列化对象的版本兼容性,通常需要定义一个
serialVersionUID
字段。 -
序列化对象:使用
ObjectOutputStream
将对象写入到输出流中。 -
反序列化对象:使用
ObjectInputStream
从输入流中读取对象。
示例代码:
import java.io.*;
public class SerializationExample {
public static void main(String[] args) {
// 创建对象
MyObject obj = new MyObject("Kimi", 30);
// 序列化对象
try (FileOutputStream fileOut = new FileOutputStream("myObject.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(obj);
System.out.println("Serialized data is saved in myObject.ser");
} catch (IOException i) {
i.printStackTrace();
}
// 反序列化对象
MyObject deserializedObj = null;
try (FileInputStream fileIn = new FileInputStream("myObject.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
deserializedObj = (MyObject) in.readObject();
System.out.println("Deserialized object's name: " + deserializedObj.name);
} catch (IOException i) {
i.printStackTrace();
} catch (ClassNotFoundException c) {
System.out.println("Class not found");
c.printStackTrace();
}
}
}
class MyObject implements Serializable {
private static final long serialVersionUID = 1L;
String name;
int age;
MyObject(String name, int age) {
this.name = name;
this.age = age;
}
}
注意事项:
-
安全性:序列化过程中可能会暴露敏感信息,因此需要考虑安全性。
-
性能:序列化和反序列化可能会消耗较多的资源,因此需要考虑性能。
-
兼容性:在序列化对象时,需要确保
serialVersionUID
保持一致,以确保版本兼容性。 -
不可序列化对象:如果对象的某个字段没有实现
Serializable
接口,那么在序列化时会抛出NotSerializableException
。
通过序列化,Java 程序可以方便地保存和恢复对象的状态,实现数据的持久化和远程传输。