1. 程式人生 > >關於transient和static的序列化和反序列化

關於transient和static的序列化和反序列化

內存 技術分享 是什麽 output log 代碼 puts tran null

    做java開發有段時間了,最近沒那麽忙了,抽了點時間看了下java的源碼 。

    在讀源碼的時候看到了一個 transient 修飾的變量 ,字面意思是瞬變的。在以前的開發過程中也沒用到過這個修飾語,查了一下這個修飾語的作用為使被 transient 修飾的變量在序列化的時候不會被

保存到文件中,也就是通過序列化後再被反序列化後讀取這個變量不會有值,下面是演示實例


  實體類:
  public class User implements Serializable{
     private static final long serialVersionUID = 1L;
     private String name;


     private transient String password; //被transient修飾的變量
     private static String age;
  
  }

  測試類:

  public class Test {

   public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException {
   User user = new User();
   user.setAge("22");
  user.setName("小明");
  user.setPassword("admin");
  System.out.println(user.getAge()+"\t"+user.getName()+"\t"+user.getPassword());
  ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/user.txt"));
   oos.writeObject(user);
   oos.flush();
  oos.close();

  ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/user.txt"));
  User users = (User) ois.readObject();

   System.out.println(users.getAge()+"\t"+users.getName()+"\t"+users.getPassword());
   }
  }

技術分享

從運行結果可以看出用 transient 修飾的變量在反序列化後值為 null

static修飾的變量應該也是不會被序列化的,因為只有堆內存會被序列化.所以靜態變量會天生不會被序列化。

那這裏被static修飾的變量反序列化後有值又是什麽鬼 這是因為 靜態變量在方法區,本來流裏面就沒有寫入靜態變量,我們打印靜態變量當然會去方法區查找,我們當前 jvm 中有所以靜態變量在序列化後任然有值。

  接著進行對 static 修飾的變量的驗證:

public class Test {

public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException {
User user = new User();
user.setAge("22");
user.setName("小明");
user.setPassword("admin");
System.out.println(user.getAge()+"\t"+user.getName()+"\t"+user.getPassword());
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/user.txt"));
user.setAge("33"); //在序列化後在對static修飾的變量進行一次賦值操作
oos.writeObject(user);
oos.flush();
oos.close();

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/user.txt"));
User users = (User) ois.readObject();

System.out.println(users.getAge()+"\t"+users.getName()+"\t"+users.getPassword());

}
}

運行結果如下:

技術分享

    可以看到在序列化前 static 修飾的變量賦值為22,而反序列化後讀取的這個變量值為33,由此可以看出 static 修飾的變量本身是不會被序列化的

  我們讀取的值是當前jvm中的方法區對應此變量的值,所以最後輸出的值為我們對static 變量後賦的值

      以上代碼只是測試代碼,有邏輯上的問題還望大家見諒。

關於transient和static的序列化和反序列化