序列化机制允许将实现序列化的Java对象转换为字节序列,这些字节序列可以被保存在磁盘上,或通过网络传输,以备以后重新恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。
对象的序列化(Serialize)指将一个Java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该Java对象。如果需要让某个对象可以支持序列化机制,必须让它的类是可序列化的(serializable),为了让某个类是可序列化的,该类必须实现如下两个接口之一:
(1)Serializable
(2)Externalizable
一旦某个类实现了Serializable接口,则该类的对象就是可序列化的,程序可以通过如下两个步骤来序列化该对象。
序列化的步骤:
(1)创建一个ObjectOutputStream,这个输出流是一个处理流,所以必须建立在其他节点流的基础之上。
(2)调用ObjectOutputStream对象的writeObject方法输出可序列化对象。
反序列化的步骤:
(1)创建一个ObjectInputStream,这个输入流是一个处理流,所以必须建立在其他节点流的基础之上。
(2)调用ObjectInputStream对象的readObject对象读取流中的对象,该方法返回一个Object类型的Java对象,如果程序知道该Java对象的类型,则可以将该对象强制类型转换成其真实的类型。
下面仅以实现Serializable接口为例,以一个完整的实例演示序列化与反序列化的过程:
1. Person.java
import java.io.Serializable; public class Person implements Serializable { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(String name, int age) { super(); this.name = name; this.age = age; } }
2.WritePerson.java
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; public class WritePerson { public static void main(String[] args) { //创建ObjectOutputStream(处理流,必需建立在其他节点流之上)对象 try { ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("per.txt")); Person per=new Person("张三",18); oos.writeObject(per); oos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
3. ReadPerson .java
public class ReadPerson { public static void main(String[] args) { try(ObjectInputStream ois=new ObjectInputStream(new FileInputStream("per.txt"))) { Person per=(Person)ois.readObject(); System.out.println(per.getName()+"-----------"+per.getAge()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
在JavaEE中,一般要求每个JavaBean都是可序列化的。序列化机制在JavaEE的开发中非常重要。希望可以引起读者重视。