今天在看struts1源代码的时候,发如今ActionForm中首先声明了两个transient类型的protected变量。
之前没有接触过该transient类型,所以就查了查。
transient是java语言的keyword,变量修饰符。假设用它声明一个实例变量。当对象存储时,它的值不须要维持。
在java中一个对象仅仅要实现了Serilizable接口,这个对象就能够被序列化。java的这样的序列化模式为开发人员提供了非常多便利,我们能够不必关系详细序列化的过程,仅仅要这个类实现了Serilizable接口。这个的全部属性和方法都会自己主动序列化。
然而在实际开发过程中,我们经常会遇到这种问题,这个类的有些属性须要序列化,而其它属性不须要被序列化。诚然,你能够让这个类来实现Externalizable接口,这个接口是Serilizable的子接口,可是你必须实现readExternal和writeExternal方法。你能够在这两个方法中实现详细属性的反序列化和序列化操作。然而这就意味着你必须在这两个方法中手工编写额外的代码来进行详细属性的序列化。
这时transient就派上用场了,你仅仅须要实现Serilizable接口,将不须要序列化的属性前加入keywordtransient,序列化对象的时候。这个属性就不会序列化到指定的目的地中。
而在struts源代码中。ActionForm也确实是implement了Serilizable接口。
以下是个小样例。从执行结果上就能够看明确了
public class TestTransient { public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { A a = new A(25,"姓名"); System.out.println(a); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c://transient.txt")); oos.writeObject(a); oos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c://transient.txt")); a = (A)ois.readObject(); System.out.println(a); } } class A implements Serializable{ int a; transient String b; public A(int a,String b){ this.a = a; this.b = b; } public String toString(){ return "a = "+a+",b = "+b; } }
执行结果例如以下:
a = 25,b = 姓名
a = 25,b = null
在上面的样例中,我将属性b前加入keywordtransient,我们看到尽管我们序列化的对象a的属性值为“张三”,可是当我们反序列化之后发现这个属性为空。说明这个属性没有进行序列化。