Java关键字 transient

来源:互联网 发布:22周胎儿发育标准数据 编辑:程序博客网 时间:2024/06/02 03:08

在上班无事可做时,开始试着自己去看看源码,首先接触不必多说,最为常见的Collection接口下的一些常用类。

打开ArrayList,继承抽象类AbstractList,实现List、RandomAccess、Cloneable、Serializable接口

第一个属性serialVersionUID,不必过多解释,序列化的相关属性

第二个属性elementData,Object数组类型,transient关键字修饰。

transient是什么,从来没见过,好去查一下。


查完回来:transient修饰的属性,不参与序列化,不再是对象持久化的一部分,有transient修饰的属性,类要实现Serializable接口,

下面通过代码去解释这儿

class UserInfo implements Serializable {    private static final long serialVersionUID = 154111313L;    private String userName;    private transient String passWord;    /**       * 获取userName       * @return userName userName     */    public String getUserName() {        return userName;    }    /**       * 设置userName       * @param userName userName     */    public void setUserName(String userName) {        this.userName = userName;    }    /**       * 获取passWord       * @return passWord passWord     */    public String getPassWord() {        return passWord;    }    /**       * 设置passWord       * @param passWord passWord     */    public void setPassWord(String passWord) {        this.passWord = passWord;    }}
实体类UserInfo

public static void main(String[] args) {    UserInfo user = new UserInfo();    user.setUserName("Daming");    user.setPassWord("111222333");    System.out.println(user.getUserName() + "/" + user.getPassWord());    try {        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(new File("D:/a.txt")));        os.writeObject(user);        os.flush();        os.flush();    } catch (Exception e) {        // TODO: handle exception    }    try {        ObjectInputStream oi = new ObjectInputStream(new FileInputStream(new File("D:/a.txt")));        UserInfo userCopy = (UserInfo) oi.readObject();        oi.close();        System.out.println(userCopy.getUserName() +"/" + userCopy.getPassWord());    } catch (Exception e) {        // TODO: handle exception    }    }
测试方法如上

测试结果

Daming/111222333Daming/null
能观察到什么,UserInfo在被序列化后传入文件内,再从文件中读取时为空。我的理解是在对象转化为字节数组时该属性无法序列化,所以值为空,传入文件里也为空。

大致能得到的一个结论是,被transient修饰的属性只能在内存中存活,当对该对象进行持久化操作时,该属性无法被序列化,所以不能保存完整的属性信息。

应用:数据传输安全方面。

原创粉丝点击