Java的transient关键字,变量修饰符

序列化是什么: 
  序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。 Java的序列化机制是RMI、EJB、JNNI等技术的技术基础。
  序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。

对象序列化不仅要将基本数据类型转换成字节表示有时还要恢复数据。恢复数据要求有恢复数据的对象实例 

序列化的什么特点: 
  如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。 
什么时候使用序列化: 

  a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;

  b)当你想用套接字在网络上传送对象的时候;

  c)当你想通过RMI传输对象的时候;

  类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或    字段,仅用于标识可序列化的语义。

       然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,诚然,你可以让这个类来实现Externalizable接口,这个接口是Serilizable的子接口,但是你必须实现readExternal和writeExternal方法,你可以在这两个方法中实现具体属性的反序列化和序列化操作。然而这就意味着你必须在这两个方法中手工编写额外的代码来进行具体属性的序列化。java的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

public class TestTransient {

/** * @param args * @throws IOException  * @throws FileNotFoundException  * @throws ClassNotFoundException  */

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://mm.txt"));   

oos.writeObject(a);   

oos.close();   

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c://mm.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前添加关键字transient,我们看到虽然我们序列化的对象a的属性值为“张三”,但是当我们反序列化之后发现这个属性为空,说明这个属性没有进行序列化

posted @ 2013-04-23 23:54  Dream-Weaver  阅读(321)  评论(0编辑  收藏  举报