下面是一個串列化的例子,程序中串列化保存name,hobby,birth和age,然而name是static的,我們將看到不能對static進行串列化,因此串列化後,改變會保持。hobby和birth是transient的,也不能串列化,但我們定義了自己的
private void writeObject(ObjectOutputStream os)
private void readObject(ObjectInputStream is)
並在其中對birth進行了自定義的寫入與讀出,因此會看到hobby變為了null,而birth得到保存。普通變數age顯然可以正常得到保存,os.defaultWriteObject();就是對其進行保存。
同時可以看到,如果我們對某個類的對象進行串列化時,如果該類的父類沒有實現Serializable介面,也就是說父類不能被串列化時,當反串列化後,會自動運行父類的構造函數,我們就是利用這個特點輸出提示信息的。
package serializetest;
import java.io.*;
class Base
{
public Base()
{
System.out.println("下面是我的個人信息:");
}
}
public class Main extends Base implements Serializable
{
static String name = null;
transient String hobby = null;
transient String birth = null;
int age = 0;
public Main()
{
name = "lcrystal";
hobby = "sleep";
birth = "1983/06/23";
age = 24;
}
public static void main(String[] args)
{
Main ts = new Main();
try
{
/* 任何文件名和後綴都可以 */
FileOutputStream fos = new FileOutputStream("g://save.lc");
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(ts);
os.flush();
os.close();
fos.close();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
ts.name = "s0meb0dy";
ts.hobby = "sleep"; /* 我僅有的愛好!*/
ts.birth = null;
ts.age = 27;
try
{
FileInputStream fis = new FileInputStream("g://save.lc");
ObjectInputStream is = new ObjectInputStream(fis);
ts = (Main)is.readObject();
is.close();
fis.close();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(ts.name);
System.out.println(ts.hobby);
System.out.println(ts.birth);
System.out.println(ts.age);
}
private void writeObject(ObjectOutputStream os)
{
try
{
os.defaultWriteObject();
os.writeUTF(birth);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
private void readObject(ObjectInputStream is)
{
try
{
is.defaultReadObject();
birth = is.readUTF();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}