1、java對象序列化不保存對象中的靜態變量

serpublic class Test implements Serializable {
private static final long serialVersionUID = 1L;
public static int staticVar = 5;
public static void main(String[] args) {
try {
//初始時staticVar為5
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("result.obj"));
out.writeObject(new Test());
out.close();
//序列化后修改為10
Test.staticVar = 10;
ObjectInputStream oin = new ObjectInputStream(new FileInputStream(
"result.obj"));
Test t = (Test) oin.readObject();
oin.close();
//再讀取,通過t.staticVar打印新的值
System.out.println(t.staticVar);//10
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
2、虛擬機是否允許反序列化,不僅取決于類路徑和功能代碼是否一致,一個非常重要的一點是兩個類的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)。
3、父類的序列化與transient關鍵字
只有子類和父類都實現了Serializable接口時,對子類反序列化時才會將父類也序列化。反序列化過程是先反序列過父類對象再反序列化子類。而如果不想序列化某一個變量,則可以在定義變量時使用transient關鍵字。

Parentimport java.io.Serializable;
public class Parent implements Serializable {
private static final long serialVersionUID = 1L;
public int pi = 2;
public String pstr ="pstr";
public transient String ts ;
}

Son and mainimport java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Son extends Parent implements Serializable {
private static final long serialVersionUID = 1L;
public int si = 1;
public String sstr = " sstr";
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
String path = "d:" + File.separator + "son.dll";
Son s = new Son();
s.si = 2;
s.pi = 2;
s.ts = "ts"; // ts在父類中的定義使用transient關鍵字
ObjectOutputStream op = null;
ObjectInputStream oi = null;
op = new ObjectOutputStream(new FileOutputStream(new File(path)));
op.writeObject(s);
op.close();
oi = new ObjectInputStream(new FileInputStream(path));
Son s1 = (Son) oi.readObject();
System.out.println("父類中的String pstr:" + s1.pstr);
System.out.println("父類中的int pi:" + s1.pi);
System.out.println("子類中的int si:" + s1.si);
System.out.println("父類中的transient String ts :" + s1.ts);//
}
}
4、Java 序列化機制為了節省磁盤空間,具有特定的存儲規則,當寫入文件的為同一對象時,并不會再將對象的內容進行存儲,而只是再次存儲一份引用。
從IBM DW 整理而來
http://www.ibm.com/developerworks/cn/java/j-lo-serial/index.html#icomments