transient简要说明

   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。反序列化后也说明这一点,为较少长度,本文不贴出反序列化代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值