java transient简介

来源:互联网 发布:php和java哪个工资高 编辑:程序博客网 时间:2024/06/05 10:13

java transient简介

我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个的所有属性和方法都会自动序列化。
然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,诚然,你可以让这个类来实现Externalizable接口,这个接口是Serilizable的子接口,但是你必须实现readExternal和writeExternal方法,你可以在这两个方法中实现具体属性的反序列化和序列化操作。然而这就意味着你必须在这两个方法中手工编写额外的代码来进行具体属性的序列化。java的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

package othertest;import java.io.*;public class TestTransient {    public static void main(String[] args) throws IOException, ClassNotFoundException {        Person a = new Person(1, "张三");        System.out.println(a);        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e://transient.txt"));        oos.writeObject(a);        oos.close();        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e://transient.txt"));        Person a1 = (Person) ois.readObject();        System.out.println(a1);        ois.close();    }}class Person implements Serializable {    private  int num;    //不需要序列化的字段用transient修饰    private transient String name;    public Person(int num, String name) {        this.num = num;        this.name = name;    }    public int getNum() {        return num;    }    public void setNum(int num) {        this.num = num;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String toString() {        return "编号:"+num+"  姓名:"+name;    }}

运行结果如下:
编号:1 姓名:张三
编号:1 姓名:null
在上面的列子中,我们在name属性前面加了transient,序列化对象a的name属性值为“张三”,反序列化之后,可以看到这个属性值为null,说明这个属性没有被序列化。

原创粉丝点击