transient是Java中序列化相关的关键字,transient的中文意思短暂的, 瞬时的,意思表达非常到位。transient用于修饰成员变量(包括静态和非静态的),由transient修饰的变量在序列化时不保存状态,也即就是说transient变量的值不会被写入到对象流中。关于transient的具体用法本文不做详述,Google上一搜就是一堆结果,下面要介绍的是关于transient应用中需要注意的地方。
上文说的序列化时变量的状态不保存,是指变量的wrapper类序列化,而不是在wrapper类中将变量对象(如果变量是类类型)序列化,有点绕口了,看个例子吧。
- public class DataContainer implements Serializable
- {
- private static final long serialVersionUID = 2264992695229291695L;
- private String strType;
- private int primeType;
- public DataContainer(String strData, int intData)
- {
- this.strType = strData;
- this.primeType = intData;
- }
- public String getStrData()
- {
- return this.strType;
- }
- public int getIntData()
- {
- return primeType;
- }
- }
DataContainer 表示存放数据容器的类,将作为序列化的对象,下面是具体应用的类:
- public class TestAPP implements Serializable
- {
- private transient DataContainer tdatacontainer;
- public TestAPP()
- {
- this.tdatacontainer = new DataContainer(makeData(), 1);
- }
- private String makeData()
- {
- StringBuilder sb = new StringBuilder(1000);
- for(int i = 0; i< 1000; i++)
- {
- sb.append("This is a Test");
- }
- return sb.toString();
- }
- public DataContainer getContainer()
- {
- return tdatacontainer;
- }
- public static void TestOne() throws IOException
- {
- TestAPP test = new TestAPP();
- FileOutputStream fout = new FileOutputStream("TestOne.dat");
- ObjectOutputStream obout = new ObjectOutputStream(fout);
- obout.writeObject(test);
- obout.close();
- fout.close();
- }
- public void TestTwo() throws IOException
- {
- if(tdatacontainer != null)
- {
- FileOutputStream fout = new FileOutputStream("TestTwo.dat");
- ObjectOutputStream obout = new ObjectOutputStream(fout);
- obout.writeObject(tdatacontainer);
- obout.close();
- fout.close();
- }
- }
- public static void main(String[] args) throws IOException, ClassNotFoundException
- {
- TestOne();
- new TestAPP().TestTwo();
- }
- }
在Java项目目录下可以看到,TestOne.dat的大小为1K,而TestTwo.dat的大小为14K,说明TestAPP 别学列化后其成员变量tdatacontainer的状态没有被保存,而序列化TestAPP的transient成员变量tdatacontainer后其状态被保存,尽管tdatacontainer被声明为transient。反序列化后也说明这一点,为较少长度,本文不贴出反序列化代码。