简介
Java 的 Serializable
接口是一个用于对象序列化的标记接口。序列化是指将对象的状态转换为字节流的过程,这样对象可以被保存到文件中、通过网络传输或在不同的 JVM 之间传递。反序列化则是指将字节流恢复为对象的过程。
Serializable 接口的作用
Serializable
接口本身没有任何方法,它只是一个标记接口,用来告诉 Java 序列化机制(例如 ObjectOutputStream
和 ObjectInputStream
)某个类的对象可以被序列化和反序列化。
import java.io.Serializable;
public class MyClass implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
// Constructors, getters, setters, etc.
}
序列化与反序列化
序列化
将对象转换为字节流并保存到文件或传输:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class SerializeExample {
public static void main(String[] args) {
MyClass object = new MyClass(1, "example");
try (FileOutputStream fileOut = new FileOutputStream("object.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(object);
} catch (Exception e) {
e.printStackTrace();
}
}
}
反序列化
将字节流恢复为对象:
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class DeserializeExample {
public static void main(String[] args) {
MyClass object = null;
try (FileInputStream fileIn = new FileInputStream("object.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
object = (MyClass) in.readObject();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(object);
}
}
serialVersionUID
为了保证在序列化和反序列化过程中版本的一致性,建议在每个实现 Serializable
接口的类中定义一个唯一的 serialVersionUID
:
private static final long serialVersionUID = 1L;
serialVersionUID
的作用是表明类的版本,在序列化和反序列化时会进行校验。如果类的 serialVersionUID
发生变化,那么在反序列化时会抛出 InvalidClassException
异常。
使用注意事项
安全性:不要反序列化不受信任的数据,可能会引起安全问题。
兼容性:在类的结构发生变化时,可能会影响序列化和反序列化的兼容性。
性能:序列化和反序列化操作可能会影响性能,特别是在处理大对象或大量对象时