Java提供了一种对象序列化的机制,即一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据和对象中的数据类型可以用来在内存中新建对象。
序列化的整个过程都是在Java虚拟机(JVM)中独立的,即在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
public final void writeObject(Object x) throws IOException |
ObjectOutputStream类包含的该方法序列化一个对象,并将它送到输出流。
public final Object readObject() throws IOException, ClassNotFoundException |
相似的,ObjectInputStream类包含的该方法从流中取出一个对象,并将该对象反序列化。它的返回值为Object,因此需要将它转换成合适的数据类型。
下面将通过一个例子来演示序列化在Java中是怎样工作的,首先定义Employee类,该类实现了Serializable接口。
public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number; public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); } } |
接着,将在主程序中实例化一个Employee对象,并将该对象序列化到一个文件中。该程序执行后,就创建了一个名为employee.ser文件。
import java.io.*; public class SerializeDemo { public static void main(String[] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("F://java/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.println("Serialized data is saved in F://java/employee.ser"); } catch (Exception exception) { exception.printStackTrace(); } } } |
下面的程序实例了反序列化,F://java/employee.ser储存了该对象。
import java.io.*; public class DeserializeDemo { public static void main(String[] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("F://java/employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); } catch (Exception exception) { //TODO: handle exception } System.out.println("Deserialized Employee..."); System.out.println("Name: " + e.name); System.out.println("Address: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Number: " + e.number); } } |
以上程序编译运行结果如下: