Java序列化和反序列化的概念如下:
序列化:将Java对象转化为可以存储或传输的形式。
反序列化:将在序列化过程中创建的表示形式还原为Java对象。
序列化的用途主要有以下几种:
- 持久性:通过序列化可以在对象之间传递或在网络上传输。
- 分布式计算:RMI(Remote Method Invocation)使用序列化来实现远程调用。
- 安全性:由于序列化后的数据不包含任何执行代码,因此序列化也可以作为一种安全机制来防止恶意代码执行。
序列化的步骤包括:
- 创建一个实现了java.io.Serializable接口的对象。
- 使用ObjectOutputStream的writeObject()方法将对象写入流中。
反序列化的步骤包括:
- 使用ObjectInputStream的readObject()方法从流中读取对象。
- 调用适当的构造函数来创建对象并将其状态恢复为原来的值。
需要注意的是,不是所有的对象都可以被序列化,只有实现了Serializable接口或者Externalizable接口的对象才能被序列化。此外,如果一个对象的字段不想被序列化,则可以通过添加transient关键字来忽略。另外,在反序列化时还需要注意版本兼容性问题。如果有更新的类,应该保持 serialVersionUID 的值不变,以便于旧的序列化数据能够正确地反序列化到新的类上。
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person p=new Person();
p.age=18;
p.name="wb";
serialize(p,"wb.bin");
System.out.println("反序列化结果:" + deserialize("wb.bin"));
}
public static void serialize(Object obj, String filePath) throws IOException {
try (FileOutputStream fileOut = new FileOutputStream(filePath);
ObjectOutputStream objectOut = new ObjectOutputStream(fileOut)) {
objectOut.writeObject(obj);
}
}
public static Object deserialize(String filePath) throws IOException, ClassNotFoundException {
try (FileInputStream fileIn = new FileInputStream(filePath);
ObjectInputStream objectIn = new ObjectInputStream(fileIn)) {
return objectIn.readObject();
}
}
}