java中static、transient修飾的屬性不能被序列化 java中static、transient修飾的屬性不能被序列化

java中static、transient修飾的屬性不能被序列化

 

相關網頁:Java序列化的高級認識http://www.360doc.com/content/13/0728/18/13247663_303173972.shtmlhtml

如下程序來自」http://bbs.csdn.net/topics/390155251「(已驗證)
類Student1
package test;
 
import java.io.Serializable;
 
public class Student1 implements Serializable{
     private static final long serialVersionUID = 1L;
     private String name;
     private transient String password;
     private static int count = 0;
     
     public Student1(String name,String password){
    System.out.println("調用Student的帶參構造方法 ");
    this.name = name;
    this.password = password;
    count++;
     }
     
     public String toString(){
    return "人數:" + count + "姓名:" + name + "密碼:" + password;
     }
}
 
類ObjectSerTest1 
package test;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
public class ObjectSerTest1 {
     public static void main(String args[]){
    try{
    FileOutputStream fos = new FileOutputStream("test.obj");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
     
    Student1 s1 = new Student1("張三","123456");
    Student1 s2 = new Student1("王五","56");
     
    oos.writeObject(s1);
    oos.writeObject(s2);
     
    oos.close();
     
    FileInputStream fis = new FileInputStream("test.obj");
    ObjectInputStream ois = new ObjectInputStream(fis);
    Student1 s3 = (Student1) ois.readObject();
             Student1 s4 = (Student1) ois.readObject();
  
             System.out.println(s3);
             System.out.println(s4);
  
             ois.close();
         } catch (IOException e) {
             e.printStackTrace();
         } catch (ClassNotFoundException e1) {
             e1.printStackTrace();
         }
     }
}
運行結果:
調用Student的帶參構造方法 
調用Student的帶參構造方法 
人數:2姓名:張三密碼:null
人數:2姓名:王五密碼:null
 
 
 
類Test1
package test;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
public class Test1{
 
    public static void main(String args[]){
         
        try {
 
            FileInputStream fis = new FileInputStream("test.obj");
            ObjectInputStream ois = new ObjectInputStream(fis);
 
            Student1 s3 = (Student1) ois.readObject();
            Student1 s4 = (Student1) ois.readObject();
 
            System.out.println(s3);
            System.out.println(s4);
 
            ois.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        }
    }     
}
運行結果:
人數:0姓名:張三密碼:null
人數:0姓名:王五密碼:null
 
類ObjectSerTest1 的運行結果顯示count=2,彷佛被序列化了,可是類Test1的運行結果顯示count=0並未被序列化。
」序列化保存的是對象的狀態,靜態變量數以類的狀態,所以序列化並不保存靜態變量。
這裏的不能序列化的意思,是序列化信息中不包含這個靜態成員域
ObjectSerTest1 測試成功,是由於都在同一個機器(並且是同一個進程),由於這個jvm已經把count加載進來了,因此你獲取的是加載好的count,若是你是傳到另外一臺機器或者你關掉程序重寫寫個程序讀入test.obj,此時由於別的機器或新的進程是從新加載count的,因此count信息就是初始時的信息。「-----來自參考網頁
重寫類Test1讀取test.obj顯示的結果是count的初始時的信息,也驗證了上面一段話。
最後,Java對象的static,transient 修飾的屬性不能被序列化。
相關文章
相關標籤/搜索