序列化之transient关键字

序列化之transient关键字

当需要序列化一个对象时,又不想保存该对象的某个属性,这时transient关键字就派上用场了。

以下将演示给Person类的password属性添加transient关键字,然后序列化,再反序列,并对比序列化前后控制台输出的变化。

首先,定义Person类,为了防止密码泄露,给password属性添加transient关键字,表示不要序列化此属性。

public class Person implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;
    private transient String password;

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

    @Override
    public String toString(){
        return "Person [name=" + name + ", password=" + password + "]";
    }
}

然后,在Main方法中创建Person对象,先输出到控制台,用于对比反序列化后的结果。

接着,把Person对象序列化为person文件,然后再读取该文件进行反序列化为Person对象。

最后,在控制台输出反序列化后的Person对象。

public class Main {
    public static void main(String[] args) {
        //创建一个Person对象,并序列化到文件
        Person person = new Person("alice", "secret");
        System.out.println(person.toString());

        //序列化
        try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("person"))) {
            outputStream.writeObject(person);
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        //反序列化
        try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("person"))) {
            Person newPerson = (Person) inputStream.readObject();
            System.out.println(newPerson.toString());
        } catch (IOException | ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }
}

控制台输出如下:

Person [name=alice, password=secret]
Person [name=alice, password=null]

通过输出结果可以看到,Person对象的password属性的值“丢了”,被设置为了默认值null。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注