程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java中transient症結字用法剖析

java中transient症結字用法剖析

編輯:關於JAVA

java中transient症結字用法剖析。本站提示廣大學習愛好者:(java中transient症結字用法剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是java中transient症結字用法剖析正文


本文實例剖析了java中transient症結字用法。分享給年夜家供年夜家參考。詳細剖析以下:

java有個特色就是序列化,簡略地來講就是可以將這個類存儲在物理空間(固然照樣以文件的情勢存在),那末當你從當地復原這個文件時,你可以將它轉換為它自己。這可以極年夜處所便收集上的一些操作,但同時,由於觸及到平安成績,所以其實不願望把類外面一切的器械都能存儲(由於那樣,他人可以經由過程序列化曉得類外面的內容),那末我們便可以用上transient這個症結字,它的意思是暫時的,即不會隨類一路序列化到當地,所以當復原後,這個症結字界說的變量也就不再存在。

平日,我們寫的法式都請求特定信息能耐久存在或保留到磁盤上,以供一個法式應用或用在統一個法式的另外一次運轉上.這類耐久性可以經由過程幾種方法來完成,包含寫到數據庫中或是應用JAVA為對象序列化供給的支撐.不論我們選用甚麼辦法,類實例的耐久性都是經由過程保留類的域的狀況來完成的,保留這些狀況,以便今後可以對它們停止拜訪或應用它們來創立雷同的實例.但是,有能夠其實不是一切的域都須要被保留起來.當一個實例被耐久化時,其外部的一些域卻不須要耐久化,則可以用trainsient潤飾符告知編譯器指定的域不須要被耐久保留.
 
起首,讓我們看一些Java serialization的代碼:

public class LoggingInfo implements java.io.Serializable 
{ 
  private Date loggingDate = new Date(); 
  private String uid; 
  private transient String pwd; 
  
  LoggingInfo(String user, String password) 
  { 
    uid = user; 
    pwd = password; 
  } 
  public String toString() 
  { 
    String password=null; 
    if(pwd == null) 
    { 
    password = "NOT SET"; 
    } 
    else 
    { 
      password = pwd; 
    } 
    return "logon info: /n  " + "user: " + uid + 
      "/n  logging date : " + loggingDate.toString() + 
      "/n  password: " + password; 
  } 
}

如今我們創立一個這個類的實例,而且串行化(serialize)它 ,然後將這個串行化對象寫如磁盤。

LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS"); 
System.out.println(logInfo.toString()); 
try 
{ 
  ObjectOutputStream o = new ObjectOutputStream( 
        new FileOutputStream("logInfo.out")); 
  o.writeObject(logInfo); 
  o.close(); 
} 
catch(Exception e) {//deal with exception}
To read the object back, we can write 

try 
{ 
  ObjectInputStream in =new ObjectInputStream( 
        new FileInputStream("logInfo.out")); 
  LoggingInfo logInfo = (LoggingInfo)in.readObject(); 
  System.out.println(logInfo.toString()); 
} 
catch(Exception e) {//deal with exception}

假如我們運轉這段代碼,我們會留意到從磁盤中讀回(read——back (de-serializing))的對象打印password為"NOT SET"。這是當我們界說pwd域為transient時,所希冀的准確成果。

如今,讓我們來看一下大意看待transient域能夠惹起的潛伏成績。假定我們修正了類界說,供給給transient域一個默許值,代碼以下:

public class GuestLoggingInfo implements java.io.Serializable 
{ 
  private Date loggingDate = new Date(); 
  private String uid; 
  private transient String pwd; 
  
  GuestLoggingInfo() 
  { 
    uid = "guest"; 
    pwd = "guest"; 
  } 
  public String toString() 
  { 
    //same as above 
   } 
}

如今,假如我們穿行化GuestLoggingInfo的一個實例,將它寫入磁盤,而且再將它從磁盤中讀出,我們依然看到讀回的對象打印password 為 "NOT SET"。
當從磁盤中讀出某個類的實例時,現實上其實不會履行這個類的結構函數,
而是載入了一個該類對象的耐久化狀況,並將這個狀況賦值給該類的另外一個對象。

願望本文所述對年夜家的Java法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved