当两个Java进程在网络通信时,一个进程可以通过把Java对象转换为字序列,使其在网络上传送,在接收方则需要把字节序列再恢复为Java对象。对象的序列化主要有两种用途
1.把对象的字节序列永久地保存在硬盘,通常存放在一个文件中。
2.在网絽上传送对象的字节序列。
只有实现了Serializable或Extenalizable接口的类对象才能被序列化。其中Extenalizable接口继承Serializabler接口,实现Extenalizable接口完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式。
如果一个类实现Extenalizable接口,则它必须实现readExtenal(ObjectInput
in)和writeExtenal(ObjectOutput
out)方法,并且在readExtenal中会先调用类的不带参数的构造方法,所以类必须提供一个不带参数的构造方法。而在实现Serializable接口的类中,它不用调用类的任何构造方法。对于实现Serializable的类,可以通过实现private
void read/writeObject()来改变默认的序列化方式。
对于单例类要实现序列化时,为了使反序列化能够得到正确的结果,需要在类增加一个readResole()方法。
transient显式声明不对它序列化.
serialVersionUID用来表示可序列化类的不同版本的序列化兼容性。
JavaSE中的Preferences
API也提供了对象的持久性。Thinking
in java中给出一个简单的例子。
下面给出一个简单的序列化例子:
import java.io.*;
public class Customer implements Serializable {
private int age;
public Customer(int age ){
this.age = age;
}
public String toString(){
return "age="+age;
}
public static void main(String[] args)throws Exception{
Customer custormer = new Customer(24);
System.out.println("before Serializable: "+custormer);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(buf);
o.writeObject(custormer);
byte[] byteArray = buf.toByteArray();
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(byteArray));
custormer = (Customer)in.readObject();
System.out.println("After Serializable:"+custormer);
}
}