相關網頁: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 修飾的屬性不能被序列化。