Java transient关键字使用

      我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。

      然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,java的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

     此外,如果利用transient修饰静态属性时,不能被序列化。

     测试程序如下:

package com.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


/****
 * 测试Transient关键字
 */
public class TransientTest {
public static void main(String[] args) throws Exception {
User user = new User();
user.setName("zhangsan");
user.setAge(30);
user.setFlag("flag");
System.out.println(user + " " + user.getFlag());


ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(new File("C:\\Users\\test\\Desktop\\test.txt")));
oos.writeObject(user);
oos.flush();
oos.close();


ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(new File("C:\\Users\\test\\Desktop\\test.txt")));
user = (User) ois.readObject();
ois.close();


System.out.println(user + " " + user.getFlag());
}
}


class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private transient int age;
private transient static String flag;


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;
}


public static String getFlag() {
return flag;
}


public static void setFlag(String flag) {
User.flag = flag;
}


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

测试结果:

User [name=zhangsan, age=30] flag
User [name=zhangsan, age=0] flag


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章