序列化技术保存对象及其状态信息,在使用时反序列化为对象。序列化保存的是成员变量(对象状态),静态变量(属于类信息)不保存。
序列化用于持久化对象、RPC(远程过程调用)和网络传输中。对象通过序列化后在网络上传输时,基于网络安全使用秘钥对敏感字段进行加密,如用户名、密码和身份证号码。在反序列化后再基于秘钥对字段解密。在数据被劫持时保障因缺少秘钥无法获得敏感字段,保证序列化对象的数据安全。
1.类实现序列化功能只需实现java.io.Serializable接口即可。
2.序列化和反序列化保存ID一致,一般使用private static final long serialVersionUID定义序列化ID。
3.序列化父类变量时,父类也需实现Serializable接口。
4.Transient关键字可阻止序列化,被反序列化后transient变量的值被设为对应类型的初始值。
import java.io.Serializable;
public class Wroker implements Serializable {
private static final long serialVersionUID = 123456789L;
private String name;
private transient int salary;
static int age = 100;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java生态中有许多优秀的序列化框架,如arvo、protobuf、thrift、fastjson。可以基于JDK原生的ObjectOutputStream和ObjectInputStream类实现对象的序列化和反序列化,并调用其writeObject和readObject方法实现自定义序列化策略,具体代码如下:
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("worker.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Worker testObject = new Worker();
testObject.setName("alex");
oos.writeObject(testObject);
oos.flush();
oos.close();
FileInputStream fis = new FileInputStream("worker.out");
ObjectOutputStream ois = new ObjectOutputStream(fis);
Worker deTest = (Worker) ois.readObject();
System.out.println(deTest.getName());
}
以上通过文件流的方式将wroker对象的状态写入磁盘中,需要时通过文件流的方式将其读取并反序列化成对象及其状态数据。