`
aiyan2001
  • 浏览: 74002 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

transient简要说明

    博客分类:
  • ajax
阅读更多

   transient是Java中序列化相关的关键字,transient的中文意思短暂的, 瞬时的,意思表达非常到位。transient用于修饰成员变量(包括静态和非静态的),由transient修饰的变量在序列化时不保存状态,也即就是说transient变量的值不会被写入到对象流中。关于transient的具体用法本文不做详述,Google上一搜就是一堆结果,下面要介绍的是关于transient应用中需要注意的地方。

    上文说的序列化时变量的状态不保存,是指变量的wrapper类序列化,而不是在wrapper类中将变量对象(如果变量是类类型)序列化,有点绕口了,看个例子吧。

 

  1. public class DataContainer implements Serializable
  2. {
  3.     private static final long serialVersionUID = 2264992695229291695L;
  4.     
  5.     private String strType;
  6.     private int primeType;
  7.     
  8.     public DataContainer(String strData, int intData)
  9.     {
  10.         this.strType = strData;
  11.         this.primeType = intData;
  12.     }
  13.     
  14.     public String getStrData()
  15.     {
  16.         return this.strType;
  17.     }
  18.     
  19.     public int getIntData()
  20.     {
  21.         return primeType;
  22.     }
  23. }

    DataContainer 表示存放数据容器的类,将作为序列化的对象,下面是具体应用的类:

 


  1. public class TestAPP  implements Serializable
  2. {
  3.     private  transient DataContainer tdatacontainer; 
  4.     
  5.     public TestAPP()
  6.     {
  7.         this.tdatacontainer = new DataContainer(makeData(), 1);
  8.     }
  9.     
  10.     private String makeData()
  11.     {
  12.         StringBuilder sb = new StringBuilder(1000);
  13.         for(int i = 0; i< 1000; i++)
  14.         {
  15.             sb.append("This is a Test");
  16.         }
  17.         return sb.toString();
  18.     }
  19.     
  20.     public DataContainer getContainer()
  21.     {
  22.         return tdatacontainer;
  23.     }
  24.     
  25.     public static void TestOne() throws IOException
  26.     {
  27.         TestAPP test = new TestAPP();
  28.         FileOutputStream fout = new FileOutputStream("TestOne.dat");
  29.         ObjectOutputStream obout = new ObjectOutputStream(fout);
  30.         obout.writeObject(test);
  31.         obout.close();
  32.         fout.close();
  33.     }
  34.     
  35.     public void TestTwo() throws IOException
  36.     {
  37.         if(tdatacontainer != null)
  38.         {
  39.             FileOutputStream fout = new FileOutputStream("TestTwo.dat");
  40.             ObjectOutputStream obout = new ObjectOutputStream(fout);
  41.             obout.writeObject(tdatacontainer);
  42.             obout.close();
  43.             fout.close();
  44.         }
  45.     }
  46.     
  47.     public static void main(String[] args) throws IOException, ClassNotFoundException
  48.     {
  49.         TestOne();
  50.         new TestAPP().TestTwo();
  51.     }
  52. }

    在Java项目目录下可以看到,TestOne.dat的大小为1K,而TestTwo.dat的大小为14K,说明TestAPP  别学列化后其成员变量tdatacontainer的状态没有被保存,而序列化TestAPP的transient成员变量tdatacontainer后其状态被保存,尽管tdatacontainer被声明为transient。反序列化后也说明这一点,为较少长度,本文不贴出反序列化代码。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics