1:transient的作用及其使用方法

当一个对象实现类Serilizable接口,那么这个类就可以被序列化,java的这种序列化的模式为开发者提供了很多的便利。

然而在实际开发中,我们常常遇到这样的问题,一个类的部分属性需要序列化,部分属性不需要序列化。那么这部分变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写入磁盘里持久化。

   总之,java的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的字段前加上transient,序列化该对象时,该字段就不会序列化到目标地址!

     示例:

1.1实体类部分代码

import java.io.Serializable;


public class User implements Serializable {

    private String name;
    //不需要序列化的密码字段
    private transient String pwd;
    public String getName() {
        return name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

1.2测试类代码(建议不要将数据写入C盘)

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;


public class Test {
    public  static void main(String[] args) throws Exception {
        User user=new User();
        user.setName("张三");
        user.setPwd("123");
        System.out.println("序列化前:");
        System.out.println("姓名:"+user.getName()+"\t密码:"+user.getPwd());
        ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream("D:\\User.txt"));
        os.writeObject(user);
        os.flush();
        os.close();
        
        
        
        ObjectInputStream is=new ObjectInputStream(new FileInputStream("D:\\User.txt"));
        User us=(User)is.readObject();
        is.close();
        System.out.println("序列化后:");
        System.out.println("姓名:"+us.getName()+"\t密码:"+us.getPwd());
    }
}

测试结果:果然不出所料,pwd属性并没有被序列化进去

2:总结

2.1一旦变量被Transient修饰,变量则不再是持久化类的一部分,该内容在序列化后无法访问!

2.2transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能使用transient修饰的

2.3被transient修饰的变量无法被序列化,一个静态变量无论是否被transient修饰,该字段都不能被实例化!