对象序列化与反序列化
在Java中,对象序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。反序列化则是将这些信息恢复为对象的过程。Java通过实现 java.io.Serializable
接口来支持对象的序列化和反序列化。
以下是对象序列化和反序列化的基本概念和步骤:
1. 使类实现 Serializable
接口
要使一个类的对象可以被序列化,该类需要实现 java.io.Serializable
接口。这个接口是一个标记接口,不包含任何方法。
import java.io.Serializable;
public class MyObject implements Serializable {
// 类定义
}
2. 序列化对象
要序列化一个对象,你可以使用 ObjectOutputStream
类。
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class SerializationExample {
public static void main(String[] args) {
MyObject obj = new MyObject();
// 对象初始化和设置属性...
// 序列化对象
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("filename.obj"))) {
oos.writeObject(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. 反序列化对象
反序列化对象需要使用 ObjectInputStream
类。
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class DeserializationExample {
public static void main(String[] args) {
// 反序列化对象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("filename.obj"))) {
MyObject obj = (MyObject) ois.readObject();
// 使用 obj...
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. 处理序列化过程中的特殊情况
- 可序列化和不可序列化对象的引用:如果一个可序列化对象中包含对不可序列化对象的引用,将导致序列化过程中出现
NotSerializableException
。 - 序列化ID:为了确保序列化和反序列化的对象版本兼容,可以通过声明一个名为
serialVersionUID
的静态常量来指定类的唯一标识符。 - 自定义序列化:通过实现
private void writeObject
和private void readObject
方法,可以自定义对象的序列化和反序列化行为。
示例:添加 serialVersionUID
import java.io.Serializable;
public class MyObject implements Serializable {
private static final long serialVersionUID = 1L; // 版本号
// 类定义
}
注意事项
- 只有实现了
Serializable
接口的类的实例才可以被序列化。 - 序列化并不是保存所有字段的副本,而是保存对象的运行时状态。
- 静态字段不会被序列化,因为它们不属于对象的状态。
- 序列化过程中可能会抛出
IOException
,因此在操作过程中需要处理异常。