我们都知道一个对象只要实现了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