下面是一个串行化的例子,程序中串行化保存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());
}
}
}