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


    做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 變量后賦的值

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM