1. 定义
序列化:把对象转换为字节序列的过程称为对象的序列化。将JVM堆中对象以文件的方式保存下来。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。将文件加载进内存,恢复到序列化之前的状态。
2. 序列化场景
将内存中的对象状态保存到数据库或文件中;
对象在网络中以套接字进行传送;
通过RMI传送对象。
3. 实现序列化
ObjectOutputStream:对象输出流,writeObject(Object obj)可以指定obj对象序列化,并把得到的字节写到目标输出流。
ObjectInputStream:对象输入流,readObject()可以从源输入流读取字节序列,反序列化成对象,将其返回。
只有实现了Serializable,Externalizable接口的类的对象才能被序列化。
Serializable:接口中没有具体方法。会采用默认的序列化方式。
Externalizable:继承自Serializable,如果实现Externalizable接口需要类本身重写writeExternal(ObjectOutput out)和readExternal(ObjectInput in),完全由类本身控制序列化行为。
方法的重写较为简单,需要在方法小红分别out.writeXxx();和 in.readXxx()将字段写入和读出,注意写入的顺序和读出的顺序可以一致,因为对象装载是有序的。
3.1 实体类实现Serializable接口实现序列化
/*** 用户类,实现Serializable接口*/
public class User implementsSerializable {privateString username;privateString password;private intage;publicUser() {
}public User(String username, String password, intage) {this.username =username;this.password =password;this.age =age;
}publicString getUsername() {returnusername;
}public voidsetUsername(String username) {this.username =username;
}publicString getPassword() {returnpassword;
}public voidsetPassword(String password) {this.password =password;
}public intgetAge