序列化和反序列化的主要用途:
- 数据持久化:将对象转换为可存储的格式,以便后续读取或恢复。
- 网络传输:在网络上传输对象数据。
- 缓存:将对象序列化后存储在缓存中,以提高性能。
- 深拷贝:通过序列化和反序列化创建对象的深拷贝。
- 跨平台数据交换:不同编程语言之间交换数据。
实现方式
- 实现
Serializable
接口,Serializable 是一个标记接口,它没有定义任何方法 - 使用 ObjectOutputStream#writeObject() 方法序列化
- 使用 ObjectInputStream#readObject() 方法反序列化
示例:
import java.io.*;
// 定义一个可序列化的类
class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("张三", 30);
// 序列化
try (FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(person);
System.out.println("对象已被序列化");
} catch (IOException i) {
i.printStackTrace();
}
// 反序列化
try (FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Person deserializedPerson = (Person) in.readObject();
System.out.println("对象已被反序列化");
System.out.println("反序列化后的对象: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
在实际应用中,可能会将序列化数据存储在数据库中,或通过网络发送。
序列化机制的注意事项:
- 所有需要序列化的类都必须实现
Serializable
接口。 - 不是所有的对象都可以被序列化,比如含有文件句柄或数据库连接的对象。