Java序列化API使用

274 阅读2分钟

序列化技术保存对象及其状态信息,在使用时反序列化为对象。序列化保存的是成员变量(对象状态),静态变量(属于类信息)不保存。

序列化用于持久化对象、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生态中有许多优秀的序列化框架,如arvoprotobufthriftfastjson。可以基于JDK原生的ObjectOutputStreamObjectInputStream类实现对象的序列化和反序列化,并调用其writeObjectreadObject方法实现自定义序列化策略,具体代码如下:

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对象的状态写入磁盘中,需要时通过文件流的方式将其读取并反序列化成对象及其状态数据。