序列化概述
简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!
序列化的实现
将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
import java.io.*;
public class ObjectStream {
public static void main(String[] args) {
try{
FileOutputStream fos=new FileOutputStream("res//student.dat" );
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(new Person("张三","男",10,"移动","篮球","河北"));
oos.writeObject(new Person("李四","女",12,"移动","乒乓球","河南"));
oos.writeObject(new Person("王五","男",14,"移动","足球","河北"));
oos.close();
FileInputStream fis=new FileInputStream("res//student.dat");
ObjectInputStream ois=new ObjectInputStream(fis);
try{
while(ois.available()!=-1){
Person p=(Person)ois.readObject();
p.show();
}
}catch(EOFException eof){
ois.close();
}
}catch(IOException ie){
System.out.println(ie.getMessage());
}catch(ClassNotFoundException cfe){
System.out.println(cfe.getMessage());
}
}
}
程序运行结果为:
修改默认的序列化机制
在序列化的过程中,有些数据字段我们不想将其序列化,对于此类字段我们只需要在定义时给它加上transient关键字即可,对于transient字段序列化机制会跳过不会将其写入文件,当然也不可被恢复。但有时我们想将某一字段序列化,但它在SDK中的定义却是不可序列化的类型,这样的话我们也必须把他标注为transient,可是不能写入又怎么恢复呢?好在序列化机制为包含这种特殊问题的类提供了如下的方法定义:
private void readObject(ObjectInputStream in) throws
IOException, ClassNotFoundException;
private void writeObject(ObjectOutputStream out) throws
IOException;
(注:这些方法定义时必须是私有的,因为不需要你显示调用,序列化机制会自动调用的)
使用以上方法我们可以手动对那些你又想序列化又不可以被序列化的数据字段进行写出和读入操作。