Serializable 和 transient 的關係

1.Serializable

只有一個實現Serializable接口的對象可以被序列化工具存儲和恢復。Serializable接口沒有定義任何成員。它只用來表示一個類可以被序列化。如果一個類可以序列化,它的所有子類都可以序列化。

聲明成transient的變量不被序列化工具存儲。同樣,static變量也不被存儲。
private void serializeSessionObject(HttpSession session, File targetFile, User user) throws IOException {
    targetFile.deleteOnExit();
    FileOutputStream fos = new FileOutputStream(targetFile);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(user);
    oos.flush();
    oos.close();
    session.setAttribute(USER_OBJECT_KEY, user);
    session.setAttribute(USER_SERIALIZE_FILE_KEY, targetFile.getAbsolutePath());
  }
private void unserializeSessionObject(HttpSession session, File sourceFile) throws IOException {
    FileInputStream fis = new FileInputStream(sourceFile);
    ObjectInputStream ois = new ObjectInputStream(fis);
    User user = null;
    try{
      user = (User)ois.readObject();
    }
    catch(ClassNotFoundException ex){
      throw new RuntimeException("Deserialize user object occurs error.",ex);
    }
    ois.close();
    session.setAttribute(USER_OBJECT_KEY, user);
    session.setAttribute(USER_SERIALIZE_FILE_KEY, sourceFile.getAbsolutePath());
  }

2.transient 關鍵字有什麼用途

java有個特點就是序列化,簡單地來說就是可以將這個類存儲在物理空間(當然還是以文件的形式存在),那麼當你從本地還原這個文件時,你可以將它轉換爲它本身。這可以極大地方便網絡上的一些操作,但同時,因爲涉及到安全問題,所以並不希望把類裏面所有的東西都能存儲(因爲那樣,別人可以通過序列化知道類裏面的內容),那麼我們就可以用上transient這個關鍵字,它的意思是臨時的,即不會隨類一起序列化到本地,所以當還原後,這個關鍵字定義的變量也就不再存在。

通常,我們寫的程序都要求特定信息能持久存在或保存到磁盤上,以供一個程序使用或用在同一個程序的另一次運行上.這種持久性可以通過幾種方式來實現,包括寫到數據庫中或是利用JAVA爲對象序列化提供的支持.不管我們選用什麼方法,類實例的持久性都是通過保存類的域的狀態來完成的,保存這些狀態,以便以後可以對它們進行訪問或使用它們來創建相同的實例.然而,有可能並不是所有的域都需要被保存起來.當一個實例被持久化時,其內部的一些域卻不需要持久化,則可以用trainsient修飾符告訴編譯器指定的域不需要被持久保存.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章