1.序列化与反序列化
Java的对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。也就是说,可以在运行Windows系统的计算机上创建 一个对象,将其序列化,通过网络将它发送给一台运行Unix系统的计算机,然后在那里准确地重新组装,而却不必担心数据在不同机器上的表示会不同,也不必关心字节的顺序或者其他任何细节。
就其本身来说,对象的序列化是非常有趣的,因为利用它可以实现轻量级持久性 (lightweight persistence)。"持久性”意味若一个对象的生存周期井不取决千程序是否正在执行, 它可以生存千程序的调用之间。通过将一个序列化对象写人磁盘,然后在重新调用程序时恢复该对象,就能够实现持久性的效果。之所以称其为"轻址级”,是因为不能用某种“persistent"(持久)关键字来简单地定义一个对象,井让系统自动维护其他细节问题(尽管将来有可能实现)。相反,对象必须在程序中显式地序列化(serialize)和反序列化还原(deserialize)。
我们知道实现对象的序列化需要实现Serializeable接口,java中没有关键字定义对此做支持。该接口仅是一个标记接口,不包括任何方法。
要序列化一个对象,首先要创建某些OutputStream对象,然后将其封装在一个ObjectOutputStream对象内。这时,只需调用writeObjectO即可将对象序列化,并将其发送给OutputStream (对象化序列是基于字节的,因要使用lnputStream和OutputStream继承层次结构)。要进行反序列化(即将一个序列还原成一个对象),需要将一个lnputStream封装在ObjectlnputStream内, 然后调用readObject()。
对象序列化能将一个对象下的所有信息转为一个序列,包括对象下的所有引用。
接下来我们写个序列化于反序列化的实例:
class Worm implements Serializable {
private Data[] data ={
new Data(1),
new Data(2),
new Data(3)
};
private String name;
private String age;
@Override
public String toString() {
return "Worm{" +
"data=" + Arrays.toString(data) +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
public static void main(String[] args) throws Exception{
Worm worm = new Worm();
worm.name = "jeep";
worm.age = "18";
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("worm.txt"));
//对象序列化
out.writeObject(worm);
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("worm.txt"));
//反序列化
Worm readWorm = (Worm)in.readObject();
System.out.println("打印反序列化对象结果"+readWorm);
}
}
class Data implements Serializable {
private int n;
public Data(int n){
this.n = n;
}
@Override
public String toString() {
return "Data{" +
"n=" + n +
'}';
}
}
output:
如果我们是将上面这个对象序列化之后通过网络发给另一台计算机,要想使用这个对象,必须保证其java虚拟机能够找到该对象的.class文件。
2.序列化的控制
如果我们不想使用让子对象序列化的话可以让子对象实现Externalizable接口而不是实现Serializable,Externalizable接口继承了Serializable接口,同时增添了两个方法,如下图:
另外如果我们不想对象中某个字段被序列化,我们可以将这个字段用transient 关键字修饰以来关闭其自动序列化。当然即使被transient 关键字修饰,我们也可以在对象中重写writeObject(),readObject()方法以达到序列化和反序列化的目的。