在一些特殊场景里,如果有某些实例变量是敏感信息,比如银行账户信息,我们可能不希望它被序列化。又或者某个成员变量本身是不可以被序列化的,为了避免出现Java.io.NotSeriazableException,我们希望在序列化它所在的对象时该成员变量不会被递归序列化。可以使用trasient关键字对这些成员变量进行修饰。

使用trasient关键字虽然方便,但是也可能带来问题:我们在进行反序列化时无法恢复这些成员变量了。因此Java提供了自定义序列化的机制,允许我们在自定义各个成员变量是否序列化以及让程序控制如何序列化各实例变量。下面程序通过重写writeObject(),readObject()方法实现自定义序列化,对隐私数据name进行了加密,降低安全风险,同时有可以反序列化回来。

public class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //Override
    private void writeObject(ObjectOutputStream out) throws IOException{
        out.writeObject(new StringBuffer(name).reverse());
        out.writeInt(age);
    }

    private void readObject(ObjectInputStream in) throws ClassNotFoundException, IOException {
        this.name = ((StringBuffer)in.readObject()).reverse().
                toString();
        this.age = in.readInt();
    }
}