
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
先实现序列化接口,使用ObjectOutputStream序列化
好像没有什么关系把,某个对象需要序列化,这个对象的类实现java.io.Serializable即可,此接口中没有任何需要覆盖的方法。如果硬说跟哪个流有关系,应该是这两个吧java.io.ObjectOutputStream,java.io.ObjectInputStream,这两个流可以直接操作对象(比如Person对象),像你上面说的流只能操作数据,而不能是对象的,这两个对象是对应的,一个是写对象,一个是读对象。
什么时候用序列化?
一般我们的对象是在堆内存中的,不是持久化存储,而你需要持久化存储(即存到硬盘上),等待下次继续来读取这个对象来操作,这时候就需要把这个Person类实现序列化接口java.io.Serializable,java.io.ObjectOutputStream,java.io.ObjectInputStream来读写,用你用你说的那些流是无法做到的。另外,如果你的对象需要在网络上传来传去的,也需要序列化。
纯手工打,本人也是初学,解释的不好还请见谅!
一个简单的Java序列化的例子
import java.io.*;
import java.util.*;
class Data implements Serializable { // 实现序列话接口
private int n;
public Data(int n) { this.n = n; }
public String toString() { return Integer.toString(n); }
}
public class Worm implements Serializable {
public static void main(String[] args)
throws ClassNotFoundException, IOException { // 序列话读入和写入Object可能会有这两个异常
// 将你要序列化的object,保留到一个文件中
Random rand = new Random();
Data d = new Data(rand.nextInt(10)); //构建你需要序列话的Object
System.out.println("d = " + d);
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("worm.out")); // 准备写入的文件
out.writeObject(d);
out.flush();
out.close(); // 执行到这里你可以看见worm.out这个文件,
// 以下的代码读出你刚刚写入Object
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("worm.out")); // 读你刚刚写入的文件
Data d2 = (Data)in.readObject(); // 重新构建你刚刚写入的Object
System.out.println("d2 = " + d2); }
}