我们知道当Java创建对象时,只要你需要,它就会一直存在,但是在程序终止时,无论如何它都不会继续存在。尽管这么做肯定有意义的,但是仍旧存在某些情况,如果对象能够在程序不运行的情况下仍能存在并保存其信息,那将非常有用。这样,在下次运行程序时,该对象将被重建并且拥有的信息与程序上次运行时他所拥有的信息相同。
Java序列化将呢些实现了Serializable的接口的对象转换成一个字节序列,并能够在以后将这个字节序列化完全恢复为原来的对象。这一过程甚至可以通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。也就是说一个windows操作系统上的创建的对象,如果你通过网络传输给一台Unix的机器,在那里重新组装,而却不必担心数据在不同机器上的表示会不同。
就其本身来说,对象的序列化是非常有趣的,因为利用它可以实现轻量级持久性。“持久性”意味着一个对象的生命周期并不取决于程序是否在执行,它可以生存于程序之间的调用。(这也是为什么安卓不同activity之间可以传递序列化对象的原因,当然安卓也有自己的序列化接口Parcelable)。
要序列化一个对象,首先要创建某些OutputStream对象,然后将其封装在一个ObjectOutput-Stream对象内。这时,只需要调用writeObject()即可将对象序列化。
反序列化需要将一个InputStreame封装在ObjectInputStreame内,然后调用readObject。
public class Worm implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private static Random random = new Random();
private Data[] d = {
new Data(random.nextInt(10)),
new Data(random.nextInt(10)),
new Data(random.nextInt(10))
};
private Worm next;
private char c;
public Worm(int i,char x) {
System.out.println("Worm consturctor :" + i);
c = x;
if (--i > 0) {
next = new Worm(i, (char)(x+1));
}
}
public Worm() {
System.out.println("Default consructor");
}
@Override
public String toString() {
return "Worm [d=" + Arrays.toString(d) + ", next=" + next + ", c=" + c
+ "]";
}
public static void main(String[] args) throws Exception{
Worm worm = new Worm(6, 'a');
System.out.println("w1 "+worm);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("worm.out"));
objectOutputStream.writeObject("Worm storage\n");
objectOutputStream.writeObject(worm);
objectOutputStream.close();
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("worm.out"));
String s = (String) inputStream.readObject();
System.out.println(s);
Worm worm2 = (Worm) inputStream.readObject();
System.out.println("w2 "+worm2);
inputStream.close();
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream2 = new ObjectOutputStream(arrayOutputStream);
objectOutputStream2.writeObject(worm);
objectOutputStream2.flush();
ObjectInputStream inputStream2 = new ObjectInputStream(new ByteArrayInputStream(arrayOutputStream.toByteArray()));
Worm worm3 = (Worm) inputStream2.readObject();
System.out.println("w3 "+worm3);
}
}
class Data implements Serializable{
private int n;
//private transient int n;让字段避免序列化
public Data(int n) {
super();
this.n = n;
}
@Override
public String toString() {
return "Data [n=" + n + "]";
}
}