java基本类型和许多常用库类都实现了Serializable接口,该接口允许我们对实现了其接口的类进行序列化操作,也就是保存对象的状态。我们在下面几种情况经常会使用到序列化:
(1)把一个对象状态保存到文件中
(2)使用套接字传送对象时
(3)通过RMI传送对象时
下面,我们对序列化进行简单介绍。
1.基本类型和实现了Serializable接口的类都允许进行序列化
2.static和transient变量不能被自动保存
对象中的static和transient修饰的变量,不会自动进行状态保存。当我们通过ObjectOutputStream保存对象状态时,这些变量不会被保存。因此通过ObjectInputStream再取出时,
transient修饰的变量会为默认值或null(视对象类型)(实际上并没有取出),不过,因为static修饰的是静态变量,它会是当前该static变量的值(从Class中获得)。
3.保存static和transient变量
通过对实现了Serializable的对象增加规定的方法,我们可以保存static和transient变量的当前值。
public static int i = 1;
private void writeObject(ObjectOutputStream out) throws IOException{
out.defaultWriteObject();
out.writeInt(i);
}
private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException{
in.defaultReadObject();
i=in.readInt();
}
上面的例子中。
defaultWriteObject()
方法和
defaultReadObject()
方法只能从正在序列化的类的 writeObject 方法中调用,作用是将当前类的非静态和非瞬态字段写入此流。然后再将需要写入的静态和瞬太变量再写入(读出)即可。
注意,用在static方法时,static变量会改变该类变量的值!
4.Externalizable 完全序列化接口
除了Serializable接口之外,Externalizable接口也可以实现序列化方法。该方法需要完全自己制定序列化方法,也就是说,任何变量都需要亲自决定是否进行保存。具体是实现该接口的
@Override
public void writeExternal(ObjectOutput out) throws IOException {
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
}
上面两个方法。里面的具体实现参考3中的代码。
5.序列化方法并不保存对象方法