序列化在网络传输的过程中是一个重要的部分
序列化是一种对象持久化的手段,普遍在网络传输,RMI(远程调用)等场景中应用。
Java平台允许我们在内存中创建可复用的Java对象,这些对象的存在只在JVM运行期间。但在实际应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。
Java对象序列化可以把对象的状态保存为一组字节码,在使用时再将这些字节组装成对象(反序列化)。
在Java中,只要一个类实现了java.io.Serializable
接口,那么它就可以被序列化 ObjectOutputStream
:IO 类,包含序列化对象的方法,writeObject()
ObjectInputStream
: IO 类,包含反序列化对象的方法,readObject()
serialVersionUID:
类属性,序列化版本号,用于给 JVM 区别同名类,没有提供版本号,JVM会默认提供序列化版本号。
transient
,关键字,当序列化时,不希望某些属性参与,则可以使用这个关键字标注该属性。
定义对象
public class person implements Serializable {
private String name;
private int age;
private static final long serialVersionUID = -6849794470754667710L;
// 以下省略有参构造、无参构造、set、get、toString
}
序列化
public static void main(String[] args) throws Exception {
// 创建 Java 对象
Person person = new Person("张三",18);
// 对象输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person "));
// 使用 writeObject 序列化对象
oos.writeObject(person);
// 刷新
oos.flush();
// 关闭流
oos.close();
}
反序列化
public static void main(String[] args) throws Exception {
// 对象输入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person"));
// 使用 readObject() 反序列化
Object obj = ois.readObject();
// 使用对象
System.out.println(obj);
// 关闭流
ois.close();
}
序列化和反序列化只是为了保存对象在某一时刻的状态将其持久化。